本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
Debug 笔记 <当父进程退出时,如何使子进程退出?>
提问
我正在使用ProcessBuilder启动子进程,并且如果父进程确实需要退出子进程。
在正常情况下,我的代码可以正确阻止子进程。但是,如果我导致操作系统kill父进程,则子进程将继续运行。
有什么方法可以将子进程“绑定”到父进程,以便在父进程被杀死时退出?
类似问题:
回答一
子进程与其父进程之间没有联系。他们可能彼此知道进程ID,但是它们之间没有硬连接。
您所说的是一个孤儿过程。这是操作系统级别的问题。
意味着任何解决方案都可能取决于平台。
回答二
虽然您无法防止硬中止(例如Unix上的SIGKILL),但是可以防止导致父进程关闭(例如SIGINT)并清理子进程的其他信号。
您可以通过使用关闭挂钩来完成此任务:请参阅Runtime#addShutdownHook以及此处的相关SO问题。
您的代码可能看起来像这样:
String[] command;
final Process childProcess = new ProcessBuilder(command).start();
Thread closeChildThread = new Thread() {
public void run() {
childProcess.destroy();
}
};
Runtime.getRuntime().addShutdownHook(closeChildThread);
回答三
您可以简单地在子进程中从System.in开始读取线程。
如果您不写子进程的标准输入,则其他任何人都不会这样做,并且线程将“永远”阻塞。
但是,如果父进程被kill或以其他方式死亡,您将获得EOF(或例外)。
因此,您也可以关闭子进程。(子进程以java.lang.ProcessBuilder开头)
文章翻译自Stack Overflow :stackoverflow.com/questions/2…