python - 与 parent 一起杀死 child

标签 python subprocess sigkill

我有一个程序正在生成并与 CPU 繁重、不稳定的进程通信,这不是我创建的。如果我的应用程序崩溃或被 SIGKILL 杀死,我希望子进程也被杀死,这样用户就不必追踪它们并手动杀死它们。

我知道这个话题之前已经讨论过了,但我已经尝试了所有描述的方法,但似乎没有一个能够经受住考验。

我知道这一定是可能的,因为终端一直在这样做。如果我在终端中运行某些东西并杀死终端,那么这些东西总是会死掉。

我尝试过atexit、双叉和ptysatexit 不适用于 sigkill;双叉根本不起作用;和 ptys 我发现没有办法使用 python。

今天,我发现了 prctl(PR_SET_PDEATHSIG, SIGKILL),它应该是子进程在父进程死亡时命令自己杀死自己的一种方式。 我尝试将它与 popen 一起使用,但它似乎完全没有效果:

import ctypes, subprocess
libc = ctypes.CDLL('/lib/libc.so.6')
PR_SET_PDEATHSIG = 1; TERM = 15
implant_bomb = lambda: libc.prctl(PR_SET_PDEATHSIG, TERM)
subprocess.Popen(['gnuchess'], preexec_fn=implant_bomb)

在上面, child 被创建, parent 退出。现在你会期望 gnuchess 收到一个 SIGKILL 并死掉,但事实并非如此。我仍然可以在使用 100% CPU 的进程管理器中找到它。

谁能告诉我我对 prctl 的使用是否有问题? 或者你知道终端是如何杀死他们的 child 的吗?

最佳答案

我知道这已经有好几年了,但我找到了一个简单(有点老套)的解决方案来解决这个问题。从您的父进程中,将所有调用包装在一个非常简单的 C 程序中,该程序调用 prctl() 然后 exec() 解决了 Linux 上的这个问题。我称之为“是的”:

#include <linux/prctl.h>
#include <signal.h>
#include <unistd.h>

int main(int argc, char **argv) {
     if(argc < 2)
          return 1;
     prctl(PR_SET_PDEATHSIG, SIGHUP, 0, 0, 0);
     return execvp(argv[1], &argv[1]);
}

从 Python(或任何其他语言)生成子进程时,您可以运行“yeshup gnuchess [argments]”。您会发现,当父进程被杀死时,您的所有子进程(应该)都被很好地给予 SIGHUP。

这是可行的,因为 Linux 将尊重对 prctl 的调用(不清除它),即使在调用 execvp 之后(有效地将 yeshup 进程“转换”为 gnuchess 进程或您在其中指定的任何命令),这与 fork() 不同。

关于python - 与 parent 一起杀死 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1884941/

相关文章:

python - 使用Python从shell脚本中提取错误消息?

python - 使用 python 使用子进程从 7zip 存档中解压选定的文件

Python-yad 进度条在 python 3.4 中不起作用,但在 python 2.7 中起作用

python - 如何覆盖 sys.stdin 以复制输入流

C++ : how to close a tcp socket (server) when receiving SIGKILL

c++ - Linux kill() 意外错误

Python Pycharm : Plot gets Coarse When Zoomed in

python - pandas - 在特定日期边界上分割日期范围

python - 确定(几乎)就地计算的处理顺序

python - linux下无法杀死进程