从另一个java进程启动的java进程,没有&;不';I don’我没有按预期工作
假设有一个小Java进程,其任务是启动其他Java进程。程序类似于以下内容:从另一个java进程启动的java进程,没有&;不';I don’我没有按预期工作,java,process,background,Java,Process,Background,假设有一个小Java进程,其任务是启动其他Java进程。程序类似于以下内容: String[] command = { "/bin/sh", "-c", "some.sh" + " &"}; Process pro = Runtime.getRuntime().exec(command); //rest 第一个选项起作用是因为&,而另一个选项不起作用: String[] command = { "/bin/sh", "some.sh"}; Process pro = Runtime.g
String[] command = { "/bin/sh", "-c", "some.sh" + " &"};
Process pro = Runtime.getRuntime().exec(command);
//rest
第一个选项起作用是因为&
,而另一个选项不起作用:
String[] command = { "/bin/sh", "some.sh"};
Process pro = Runtime.getRuntime().exec(command);
//rest
问:“它不起作用”是什么意思?
答:两个选项都启动进程,但在第二个选项中,子进程在几秒钟后停止工作,但是,如果我检查正在运行的进程(ps aux | grep some.sh
),它就在那里(但什么也不做)。第一个选项运行良好,它启动进程,子进程完成任务
我不明白为什么在没有背景的情况下启动子进程时,它在
ps
processs列表中显示为活动,但它并没有什么作用 在Unix中以&
结尾启动一个命令意味着它后面将跟着另一个命令。我推测,如果进程停止,什么也不做,很可能是因为它不够智能,无法意识到另一个命令不会出现
因此,第一个没有关闭但似乎什么也没做的原因正是因为添加了&
。我想,some.sh
结束了。也许不应该,但事实确实如此
有关如何创建守护进程的信息(在Unix守护进程部分下)。在代码中,您应该创建一个shutdown变量和shutdown hook,以便在守护进程停止时,您可以执行以下代码:
private volatile boolean shutdown = false;
...
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
// What to run on shutdown
shutdown = true;
}
});
一旦你做到了这一点,在无限循环中每隔一段时间执行一次操作(当然要使用睡眠,否则你的CPU就会被浪费):
ApacheTomcat守护程序可以在windows上作为服务运行,也可以在Linux/Unix中运行。希望有帮助 在第二个示例中,您是否忘记了a
-c
?还有,到底为什么要穿过一个shell而不使用ProcessBuilder
?是的@fge,-c
是必需的。那么,你是在告诉我问题不在于使用ProcessBuilder吗?事实上,它抛出了一个sh,我进行了编辑以使其正确。如果不知道some.sh
的作用,就很难知道发生了什么。如果从命令行启动some.sh
,运行是否不中断?@fge:some.sh
启动另一个.jar,它有很多VM参数,我更喜欢在sh中准备。是的,如果我从命令行启动some.sh
,它工作正常,即使我像第一个选项一样启动它(使用&
),它也能正常工作。关键在于&
。我认为我创建守护进程的解决方案是正确的。但是,我在您的回答中了解到,子进程不适用于&
,相反,&
工作。你的回答很有帮助,谢谢。@Amanda嗯,这与我的预期相反。无论如何,我很高兴至少有部分帮助。
while(!shutdowwn) {
// Perform action here every 1000 milliseconds.
Thread.sleep(1000);
}