假设我有一个只产生一个子进程的进程.现在,当父进程因任何原因(正常或异常,通过kill,^ C,断言失败或其他任何原因)退出时,我希望子进程死掉.如何正确地做到这一点?
stackoverflow上的一些类似问题:
关于Windows的 stackoverflow的一些类似问题:
如何重新启动Java AWT应用程序?我有一个按钮,我附加了一个事件处理程序.我应该使用什么代码来重启应用程序?
我想做与Application.Restart()C#应用程序相同的事情.
我已经开始使用以下代码进行处理
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "path");
try {
Process p = pb.start();
}
catch (IOException ex) {}
Run Code Online (Sandbox Code Playgroud)
现在我需要知道我刚刚开始的进程的pid.
我正在使用fork()C/C++ 创建子进程.
当父进程结束(或由于某种原因被杀死)时,我也想要杀死所有子进程.
这是由系统自动完成的吗?或者我必须自己做?
谢谢.
预先存在的类似问题:
我将有一个父进程用于处理Web服务器重新启动.它将通知孩子停止收听新的请求,孩子会发信号通知家长已经停止收听,然后家长会发信号通知新孩子它可以开始收听.通过这种方式,我们可以完成不到100毫秒的停机时间以重启该级别(我也有一个零停机时间的孙子重启,但这并不总是足够重启).
在关闭时,服务管理器将终止父服务器.孩子如何发现父母已经结束?
使用子进程的stdin和stdout发送信号.也许我可以检测到stdin流的结束?我希望避免轮询间隔.此外,如果可能的话,我希望这是一个非常快速的检测.
通常,如果我通过以下方式创建进程:
Process proc = new ProcessBuilder("some_long_running_script.py").start();
Run Code Online (Sandbox Code Playgroud)
然后我的java程序完成,我可以看到脚本进程继续运行(如预期的那样)
但是,如果我然后添加代码:
proc.waitFor();
Run Code Online (Sandbox Code Playgroud)
然后在脚本完成之前杀死我的java程序,我可以看到脚本也死了(不像预期的那样).
这似乎是说"waitFor()"以某种方式将脚本进程与我的java进程合并,这是设计的吗?我似乎无法在文档中的任何地方看到它.
这可能是特定于操作系统吗 我在Mac Yosemite上运行
确保子进程在父进程终止时终止是很棘手的。我在 Linux 中从 Python 中找到了一个强大的解决方案,即当父进程使用prctl(PR_SET_PDEATHSIG, SIGTERM). 考虑到prctl()来自 C 标准库,C 或 C++ 可能也是如此。
关于如何在 Java 中杀死子进程有几个问题,参见例如[1]。但是,我发现没有什么比使用prctl(). 如果父级收到 SIGKILL,或者他们需要修改子级代码,大多数解决方案都会失败。通过让操作系统为我们完成这项工作,无论父级发生什么,子级总是会被成功杀死,并且子级代码不需要修改。
如何调用prctl(PR_SET_PDEATHSIG, SIGTERM)从 Java ProcessBuilder 产生的子进程?