当我的Java应用退出/崩溃时,我该如何摆脱Java子进程?

15

我在Java中启动子进程的方式如下:

final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);

现在它已经在后台运行了。一切都很好。

如果我的程序现在崩溃了(它仍然在开发中:-)),子进程似乎仍然停留在那里。我该如何使它在父Java进程死亡时自动结束?

如果有帮助的话,我正在使用Mac OS X 10.5

3个回答

10

像你所说的那样,addShutdownHook 是一个好办法。

但是:

  • 如果程序终止,不能保证一定会执行你的关闭钩子。有人可能会杀掉Java进程,在这种情况下你的关闭钩子将不会被执行。(如在这个SO问题中所述)

  • 一些标准库可能具有自己的钩子,这些钩子可能会在你的钩子之前运行。

  • 要小心死锁。

另一种可能性是将你的Java程序封装为服务


10

我已经自己解决了。我添加了一个关闭钩子,如下所示:

final String[] cmd = {"<childProcessName>"};
final Process process = Runtime.getRuntime().exec(cmd);
Runnable runnable = new Runnable() {
    public void run() {
        process.destroy();
    }
};
Runtime.getRuntime().addShutdownHook(new Thread(runnable));

1
添加关闭挂钩不是一种可靠的方法来终止子进程。这是因为当从任务管理器执行强制终止时,关闭挂钩可能不一定会被执行。一种方法是子进程可以定期监视其父进程的PID。这样,当父进程退出时,子进程可以自行退出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接