15

我在 Java 中启动一个子进程,如下所示:

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

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

如果我的程序现在崩溃(它仍在开发中:-)),子进程似乎仍然存在。当父 Java 进程终止时,如何使其自动结束?

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

4

3 回答 3

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));
于 2008-11-04T07:17:41.917 回答
10

正如你所说,addShutdownHook是要走的路。

但:

  • 如果程序终止,并不能真正保证您的关闭挂钩会被执行。有人可能会杀死 Java 进程,在这种情况下,您的关闭挂钩将不会被执行。(如this SO question中所述)

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

  • 谨防死锁。

另一种可能性是将您的 java 程序包装在 service中。

于 2008-11-04T07:34:33.020 回答
1

添加关闭钩子不是杀死子进程的可靠方法。这是因为当从任务管理器执行强制终止时,可能不一定会执行 Shutdown 挂钩。

一种方法是子进程可以定期监视其父进程的 PID。这样,当父进程退出时,子进程可以自行退出。

于 2020-07-04T05:44:22.257 回答