蟒蛇 – 杀死与父母的孩子

我有一个程序产生和与CPU重,不稳定的进程通信,而不是我创建的.如果我的应用程序崩溃或被SIGKILL杀死,我希望子进程也被杀死,所以用户不必跟踪它们并手动杀死它们.

我知道这个话题已经被覆盖了,但是我已经尝试了所有描述的方法,而且似乎没有一个可以忍耐的测试.

我知道一定是可能的,因为终端一直这样做.如果我在终端上运行某些东西,并且终止终端,东西总是会死的.

我已经尝试过,双叉和ptys. atexit不适用于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)

在上面,孩子被创建,父进程退出.现在你会期望gnuchess接收到SIGKILL并且死亡,但是它不会.我仍然可以在我的进程管理器中使用100%的CPU来找到它.

有人告诉我,如果我使用prctl?
或者你知道终端如何设法杀死他们的孩子?

prctl的PR_SET_DEATHSIG只能为这个调用prctl的进程设置,而不是任何其他进程,包括这个特定进程的子进程.我指向的手册页的方式是“这个值在fork()上被清除” – fork,当然是其他进程被派生的方式(在Linux和任何其他Unix-y OS中).

如果您无法控制要在子进程中运行的代码(在这种情况下,基本上,对于您的gnuchess示例),我建议您首先生成一个单独的“监视器”进程,跟踪所有它的兄弟姐妹(你的父进程可以让监视器知道这些兄弟姐妹的生物,因为它们产生它们),并发送杀手信号时,共同的父母死亡(监视器需要轮询,为N的N醒来每秒选择检查父级是否仍然存在;使用select等待来自父级的更多信息,超时时间为N秒,在循环内).

不是微不足道,但是这样的系统任务往往不是.终端以不同的方式(通过进程组的“控制终端”)的概念,但是当然,对于任何一个孩子来说,阻止这个关闭(双叉,nohup等等)是微不足道的.

http://stackoverflow.com/questions/1884941/killing-the-children-with-the-parent

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:蟒蛇 – 杀死与父母的孩子