从另一个java进程启动的java进程没有&没有按预期工作

时间:2014-02-20 13:19:49

标签: java process background

假设一个小的Java procces,其任务是启动其他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进程列表中处于活动状态,但它没有做任何事情。

1 个答案:

答案 0 :(得分:1)

最后在Unix中使用&启动命令意味着它将跟随另一个命令。我认为如果进程停止并且什么也不做,很可能是因为它没有足够的智能来意识到另一个命令没有到来。

因此,第一个没有关闭但似乎什么都不做的原因正是因为这个被添加&。我想some.sh结束了。也许它不应该,但确实如此。

Please look into Apache Tomcat daemon有关如何创建守护程序的信息(在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会被浪费):

while(!shutdowwn) {
    // Perform action here every 1000 milliseconds.
    Thread.sleep(1000);
}

Apache Tomcat守护程序可以作为服务在Windows上运行,也可以在Linux / Unix中运行。希望有所帮助!