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

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

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

它现在在后台运行。都很好,很好。

如果我的程序现在崩溃了(它仍然在开发中:-)),子进程似乎仍然悬而未决。如何让它在父 Java 进程死亡时自动结束?

如果有帮助,我使用的是 Mac OS X 10.5


答案 1

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

但:

  • 无法真正保证在程序终止时执行关闭钩子。有人可能会杀死Java进程,在这种情况下,您的关闭钩子将不会执行。(如本SO问题所述)

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

  • 当心死锁。

另一种可能性是将java程序包装在服务中


答案 2

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

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));

推荐