以下是代码:
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文件没有写入日志文件的权限?但我不知道如何解决这个问题。有什么建议吗?提前谢谢。
答案 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写入日志文件。