【问题标题】:How do I get rid of Java child processes when my Java app exits/crashes?当我的 Java 应用程序退出/崩溃时,如何摆脱 Java 子进程?
【发布时间】:2010-09-20 15:22:25
【问题描述】:
我在 Java 中启动一个子进程如下:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
它现在在后台运行。一切都很好。
如果我的程序现在崩溃了(它是仍在开发中:-))子进程似乎仍然徘徊。当父 Java 进程死亡时,如何使其自动结束?
如果有帮助,我使用的是 Mac OS X 10.5
【问题讨论】:
标签:
java
runtime
subprocess
shutdown
process-management
【解决方案2】:
我自己已经解决了。我添加了一个shutdown hook,如下:
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));
【解决方案3】:
添加关闭钩子不是杀死子进程的可靠方法。这是因为当从任务管理器执行强制终止时,可能不一定会执行 Shutdown 挂钩。
一种方法是子进程可以定期监视其父进程的 PID。这样子进程可以在父进程退出时自行退出。