代码
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也被杀死?
答案 0 :(得分:3)
当父进程被杀死时,儿童不会自动死亡。他们死了,如果:
signals
module contains examples如何编写信号处理程序。
所以你需要:
child.terminate()
,然后调用child.wait()
wait()
是允许操作系统垃圾收集子进程所必需的。如果你忘了它,你最终可能会遇到僵尸进程。
答案 1 :(得分:0)
在shell中终止整个进程树的一种简单方法是终止其进程组,即运行:
而不是kill $pid
。
$ kill -TERM -$pid
注意:pid被否定。
Shell为每个命令(管道)创建一个新的进程组,因此您不会杀死无辜的旁观者。
如果后代进程没有创建自己的独立进程组;他们都死了。