Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中执行linux终端命令,这涉及到写入日志文件,但不会';你没有许可吗?_Java_Linux_Shell - Fatal编程技术网

在Java中执行linux终端命令,这涉及到写入日志文件,但不会';你没有许可吗?

在Java中执行linux终端命令,这涉及到写入日志文件,但不会';你没有许可吗?,java,linux,shell,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/postgres

代码如下:

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
,它只启动服务器,但不需要写入日志文件

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

在C#中,我们能够获得控制台和错误流的句柄,然后根据需要处理它们

您是否可以从
p
获取输出流的句柄,然后以编程方式写入日志文件,而不是“>logfile…”

结尾的“&”也一样。您的
进程
API可能有一种方法将其置于后台

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

您可以使用该方法获取错误流,并通过该方法将其内容保存在文件中。更简单的是,类ProcessBuilder似乎有一个将输出重定向到文件的方法


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

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