1.28 当父进程退出时,如何使子进程退出?| Java Debug 笔记

1,009 阅读2分钟

本文正在参加「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…