如何在父进程退出 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。
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。