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

如何在python中父进程退出时终止子进程?,python,subprocess,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杀死它,pin

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\u child收到SIGTERM时,如何确保ping也被终止?

当父进程终止时,子进程不会自动终止。如果:

父节点转发信号并等待子节点终止 当孩子尝试与父母沟通时,例如通过stdio。只有当父级还创建了子级使用的文件描述符时,这才有效。 如何编写信号处理程序

因此,您需要:

收集列表中的所有子项 安装一个信号处理器 在处理程序中,迭代所有子进程 对于每个子进程,调用child.terminate,然后调用child.wait
等待是允许操作系统垃圾收集子进程所必需的。如果您忘记了这一点,您可能最终会遇到僵尸进程。

当父进程被杀死时,子进程不会自动死亡。如果:

父节点转发信号并等待子节点终止 当孩子尝试与父母沟通时,例如通过stdio。只有当父级还创建了子级使用的文件描述符时,这才有效。 如何编写信号处理程序

因此,您需要:

收集列表中的所有子项 安装一个信号处理器 在处理程序中,迭代所有子进程 对于每个子进程,调用child.terminate,然后调用child.wait
等待是允许操作系统垃圾收集子进程所必需的。如果您忘记了这一点,您可能最终会遇到僵尸进程。

终止shell中整个进程树的简单方法是终止其进程组,即运行以下命令,而不是终止$pid:

注意:pid被否定

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

如果子进程不创建自己的独立进程组;他们都死了


请参阅。

终止shell中整个进程树的一种简单方法是终止其进程组,即运行以下命令,而不是终止$pid:

注意:pid被否定

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

如果子进程不创建自己的独立进程组;他们都死了


请参阅。

您为SIGTERM安装了一个终止子进程的处理程序…您能给我指出一个示例吗?请参阅相关:您为SIGTERM安装了终止子进程的处理程序…您能给我指出一个示例吗?请参阅相关:我没有得到该语句-只有当父级还创建了子级使用的文件描述符时,该语句才有效。您能详细说明一下吗?如果父进程被终止,它的所有资源都将关闭。如果您创建一个子系统,并将其stdio描述符与父系统中的一个连接起来,那么该子系统仍然能够对父系统使用的同一控制台执行stdio操作。但父级也可以创建管道。如果父管道死亡,则管道的一端将关闭。孩子仍然握着另一端。那时,什么也没有发生。但是,下一次,孩子尝试读/写这样的管道时,它得到了一个错误。我没有得到该语句-只有当家长还创建了孩子使用的文件描述符时,该语句才起作用。您能详细说明一下吗?如果父进程被终止,它的所有资源都将关闭。如果您创建一个子系统,并将其stdio描述符与父系统中的一个连接起来,那么该子系统仍然能够对父系统使用的同一控制台执行stdio操作。但父级也可以创建管道。如果父管道死亡,则管道的一端将关闭。孩子仍然握着另一端。那时,什么也没有发生。但下一次,孩子试图读/写这样的管道时,它会得到一个错误。
$ kill -TERM -$pid