当我的Java应用程序退出/崩溃时,如何摆脱Java子进程?
我用Java启动子进程如下:
final String[] cmd = {""}; Process process = Runtime.getRuntime().exec(cmd);
它现在在后台运行。 一切都好又好。
如果我的程序现在崩溃(它仍然在开发:-)),子进程似乎仍然存在。 如何在父Java进程终止时自动结束?
如果有帮助,我使用的是Mac OS X 10.5
正如你所说, addShutdownHook是要走的路。
但:
-
如果程序终止,则无法确保执行关闭挂钩。 有人可能会杀死Java进程,在这种情况下,您的关闭挂钩将不会被执行。 (如本SO问题所述)
-
一些标准库有自己的钩子,可以在你的之前运行。
-
小心死锁。
另一种可能性是将java程序包装在服务中 。
我已经自己解决了。 我添加了一个关闭钩子,如下所示:
final String[] cmd = {""}; final Process process = Runtime.getRuntime().exec(cmd); Runnable runnable = new Runnable() { public void run() { process.destroy(); } }; Runtime.getRuntime().addShutdownHook(new Thread(runnable));