假设一个小的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
进程列表中处于活动状态,但它没有做任何事情。
答案 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中运行。希望有所帮助!