我在linux机器上运行一个python脚本,它使用subprocess.check_output()创建一个子进程,如下所示:
subprocess.check_output(["ls", "-l"], stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)
问题是,即使父进程死亡,子进程仍在运行.当父母去世时,我有什么办法可以杀死孩子的过程吗?
我有一个程序产生并与CPU重,不稳定的进程通信,而不是由我创建.如果我的应用程序崩溃或被杀死SIGKILL,我希望子进程也被杀死,因此用户不必跟踪它们并手动终止它们.
我知道之前已经讨论过这个主题,但是我已经尝试了所描述的所有方法,并且它们似乎都没有在测试中幸存下来.
我知道它一定是可能的,因为终端一直都在做.如果我在终端中运行某些东西并杀死终端,这些东西总会死掉.
我试过atexit,双叉和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)
Run Code Online (Sandbox Code Playgroud)
在上面,创建了子节点并且父节点退出.现在你会期望gnuchess得到一个SIGKILL和死,但它没有.我仍然可以在我的流程管理器中使用100%CPU找到它.
任何人都可以告诉我,我的使用是否有问题prctl?或者您是否知道终端如何设法杀死他们的孩子?
我正在从python脚本中生成5个不同的进程,如下所示:
p = multiprocessing.Process(target=some_method,args=(arg,))
p.start()
Run Code Online (Sandbox Code Playgroud)
我的问题是,当某个父进程(主脚本)被杀死时,子进程继续运行.
当父母被杀时,有没有办法杀死这样产生的子进程?
编辑:我正在尝试这个:
p = multiprocessing.Process(target=client.start,args=(self.query_interval,))
p.start()
atexit.register(p.terminate)
Run Code Online (Sandbox Code Playgroud)
但这似乎并没有奏效