如何在父进程退出 python 时终止子进程?

how to kill subprocesses when parent exits in python?

fork_child.py

中的代码
from subprocess import Popen
child = Popen(["ping", "google.com"], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out, err = child.communicate()

我 运行 从终端 window 作为 -

$python fork_child.py

从另一个终端 window 如果我得到 fork_child.py 的 PID 并用 SIGTERM 杀死它,"ping" 不会被杀死。当 fork_child 收到 SIGTERM 时,如何确保 ping 也被终止?

Children 不会在 parent 进程被终止时自动终止。如果出现以下情况,他们就会死亡:

  • parent转发信号等待children终止
  • 当 child 尝试与 parent 通信时,例如通过 stdio。仅当 parent 还创建了 child 使用的文件描述符时才有效。

signals module contains examples如何编写信号处理程序。

所以你需要:

  • 收集列表中的所有 children
  • 安装信号处理程序
  • 在处理程序中,遍历所有 child 个进程
  • 对于每个 child 进程,调用 child.terminate(),然后调用 child.wait()

wait() 是允许 OS 对 child 进程进行垃圾回收所必需的。如果您忘记了它,您可能会遇到僵尸进程。

终止 shell 中整个进程树的一个简单方法是终止其进程组,即,而不是 kill $pid、运行:

$ kill -TERM -$pid

注意:pid取反

Shell 为每个命令(管道)创建一个新的进程组,因此您不会杀死无辜的旁观者。

如果后代进程没有创建自己独立的进程组;他们都死了。

参见Best way to kill all child processes