我在 Java 中启动一个子进程,如下所示:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
它现在在后台运行。一切都很好。
如果我的程序现在崩溃(它仍在开发中:-)),子进程似乎仍然存在。当父 Java 进程终止时,如何使其自动结束?
如果有帮助,我正在使用 Mac OS X 10.5
我在 Java 中启动一个子进程,如下所示:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
它现在在后台运行。一切都很好。
如果我的程序现在崩溃(它仍在开发中:-)),子进程似乎仍然存在。当父 Java 进程终止时,如何使其自动结束?
如果有帮助,我正在使用 Mac OS X 10.5
我自己已经解决了。我添加了一个关机钩子,如下:
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));
正如你所说,addShutdownHook是要走的路。
但:
如果程序终止,并不能真正保证您的关闭挂钩会被执行。有人可能会杀死 Java 进程,在这种情况下,您的关闭挂钩将不会被执行。(如this SO question中所述)
一些标准库有自己的钩子,可能会在你之前运行。
谨防死锁。
另一种可能性是将您的 java 程序包装在 service中。
添加关闭钩子不是杀死子进程的可靠方法。这是因为当从任务管理器执行强制终止时,可能不一定会执行 Shutdown 挂钩。
一种方法是子进程可以定期监视其父进程的 PID。这样,当父进程退出时,子进程可以自行退出。