在“C”中,我可以在启动过程退出后在后台运行一个长时间的阻止过程(并且还有继续运行)。
void main(void)
{
system("some_long_blocking_process &");
exit();
}
// "some_long_blocking_process" is still running here (DESIRED BEHAVIOR)
Java的getRuntime()。exec()没有这种行为。相反,“some_long_blocking_process”在Java进程结束时立即结束。
任何人都知道如何在Java中重现这种行为?
谢谢!
感谢所有的建议......我决定使用jtahlborn的答案(这对我有用)
答案 0 :(得分:4)
试试这个:
String[] cmd = {"/bin/sh", "-c", "yourcommand args"};
Process p = Runtime.getRuntime().exec(cmd);
将重定向流重定向到/ dev / null:
String[] cmd = {"/bin/sh", "-c", "yourcommand args > /dev/null 2>&1 &"};
Process p = Runtime.getRuntime().exec(cmd);
答案 1 :(得分:3)
我们用java实现这一目标的唯一方法是添加另一层脚本。你需要一个简单的包装器脚本来调用你真正想要运行的应用程序,例如:
runner.sh:
#!/bin/sh
nohup "$@" > /dev/null 2>&1 &
然后从你的java程序中调用“/ bin / sh runner.sh the real command”。
答案 2 :(得分:1)
编辑:
你试过这个吗?
Runtime.getRuntime().exec("/bin/sh -c /usr/X11/bin/xterm &")
这对我在MacOS上有用。
上一个答案(JDK 1.5,对于没有正确阅读问题而道歉):
要在不等待的情况下执行流程,您可以使用ProcessBuilder
ProcessBuilder pb = new ProcessBuilder("/usr/X11/bin/xterm");
pb.start();
答案 3 :(得分:0)
你的问题可能是因为尾随&amp ;.尝试删除它。
getRuntime().exec()
与fork()
和exec()
更相似,而不是system()
。
system()
将命令传递给shell,它是Bash,它知道尾随的&符号意味着在后台运行该进程。
getRuntime().exec()
使用StringTokenizer
解析命令来解析命令,并且不对尾随的&符号做任何事情。这只是作为some_long_blocking_process
的第一个参数传递,可能会在未知错误时立即退出。
答案 4 :(得分:0)
您是否尝试过生成新的Thread
来运行可执行文件?尝试:
new Thread(new Runnable() {
@Override
public void run() {
try {
Runtime.getRuntime().exec(<your exec>);
} catch (IOException e) {
e.printStackTrace();
}
}
}).run();
这样,在exec完成运行(并且线程已经完成)之前,主进程不会关闭。
此外,不要手动调用应用程序中的exit(),除非您有一些压倒性的理由--JVM可以很好地检测应用程序何时自行完成。这样,您就不会强制在后台运行的关闭线程。