在Java中执行linux终端命令,涉及写入日志文件,但是没有权限?

时间:2014-02-12 17:10:09

标签: java linux shell

以下是代码:

String cmd = "/usr/local/postgresql/bin/postgres -D /usr/local/postgresql/data >logfile 2>&1 &";
Process p = Runtime.getRuntime().exec(cmd);

它不起作用。该命令应该启动postgres服务器,但我检查了服务器没有启动,这意味着该命令没有被执行。但是如果命令是这样的话,它就可以工作:/usr/local/postgresql/bin/postgres -D /usr/local/postgresql/data只启动服务器但不需要写入日志文件。

所以我猜命令中的字符可能有问题。我尝试了这个solution。它仍然没有工作。然后我意识到这可能是许可问题吗?我的意思是java文件没有写入日志文件的权限?但我不知道如何解决这个问题。有什么建议吗?提前谢谢。

3 个答案:

答案 0 :(得分:0)

在C#中,我们能够获得控制台和错误流的句柄,然后随心所欲地处理它们。

而不是“> logfile ...”,你能从p获得输出流的句柄,然后以编程方式写入你的日志文件吗?

同样的“&”在末尾。您的Process API可能有一种方法可以将其置于后台。

要排除权限,请将上面示例中的“logfile”更改为“/tmp/mytemporarylogfile.txt”,并查看是否有帮助。 (我怀疑它会因为我认为它不喜欢你在Java中的“>”,“2>& 1”和“&”的shell结构。想象一下如果你在Windows上运行它会怎么做。)

答案 1 :(得分:0)

您可以使用方法Process.getErrorStream()来获取错误流,然后您可以将其内容放在文件中。更容易,似乎ProcessBuilder类有一个方法将输出重定向到文件ProcessBuilder.redirectOutput()

但是,我不认为有办法在后台执行命令。这在shell中是有意义的,但在Java中呢?

答案 2 :(得分:0)

使用'>'重定向到文件operator是shell的一个功能,而不是OS固有的东西。您需要生成一个然后运行该进程的shell,或者读取该进程的输出并将其从Java写入日志文件。