父进程在python中退出时如何杀死子进程?

时间:2015-01-19 13:11:23

标签: python subprocess

fork_child.py中的

代码

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

我从终端窗口运行它 -

$python fork_child.py

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

2 个答案:

答案 0 :(得分:3)

当父进程被杀死时,儿童不会自动死亡。他们死了,如果:

  • 父母转发信号并等待孩子终止
  • 当孩子尝试与父母沟通时,例如通过stdio。这仅在父级还创建了孩子使用的文件描述符时才有效。

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

所以你需要:

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

wait()是允许操作系统垃圾收集子进程所必需的。如果你忘了它,你最终可能会遇到僵尸进程。

答案 1 :(得分:0)

在shell中终止整个进程树的一种简单方法是终止其进程组,即运行:

而不是kill $pid
$ kill -TERM -$pid

注意:pid被否定。

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

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

请参阅Best way to kill all child processes