从另一个java进程启动的java进程,没有&;不';I don’我没有按预期工作

从另一个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

假设有一个小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.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);
}