我有一个程序生成并与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)
在上面的代码中,创建了孩子,而父子退出。现在,您会期望gnuchess
收到一个SIGKILL
并死亡,但事实并非如此。我仍然可以在使用100%CPU的流程管理器中找到它。
有人可以告诉我我对prctl
?的使用是否有问题,或者您知道终端机如何杀死他们的孩子吗?
使用prctl的PR_SET_DEATHSIG
只能被设置
为了这个过程,在呼叫使用prctl
-没有任何其他进程,包括此特定进程的孩子。我指向的手册页表达的方式是“在fork()上清除此值”-fork
当然,这是生成其他进程的方式(在Linux和其他Unix-y
OS中)。
如果您无法控制要在子流程中运行的代码(本质上,gnuchess
例如您的示例),我建议您首先生成一个单独的小型“监控”流程,以跟踪其所有内容兄弟姐妹(您的父进程可以在生成它们时让监视器知道那些兄弟姐妹的pid),并在公共父母死后向他们发送杀手信号(监视器需要对此进行轮询,每N秒唤醒一次以供您选择N检查父级是否还活着;用于select
等待父级提供更多信息,超时时间为N秒(在循环内)。
这并非微不足道,但是通常这样的系统任务却并非如此。终端执行此操作的方式有所不同(通过过程组的“控制终端”的概念),但是对于任何孩子来说,阻止该操作都是很简单的(双叉nohup
等)。
问题内容: 我正在使用child_process.spawn()从在Ubuntu上运行的Node.JS应用程序启动脚本。据我所知,标准的分叉或生成的* nix进程通常不会在父进程死后死亡,但是当从Node.JS生成进程时,它们似乎在我的应用程序崩溃或被ctrl-c等终止时被杀死。 。 为什么会这样,并且有解决办法?我似乎在child_process API中找不到任何明显的选项。 我的应用程序启动
问题内容: 我从python脚本生成了5个不同的进程,如下所示: 我的问题是,当父进程(主脚本)以某种方式被杀死时,子进程继续运行。 当父进程被杀死时,有没有办法杀死这样生成的子进程? 编辑:我正在尝试: 但这似乎不起作用 问题答案: 我自己也遇到了同样的问题,我有以下解决方案: 打电话之前,您可以设置。然后如此处所述python.org multiprocessing 进程退出时,它将尝试终止其
问题内容: 我正在python中使用subprocess模块运行一些shell脚本。如果shell脚本运行时间很长,我想杀死该子进程。我认为如果将其传递给我的陈述就足够了。 这是代码: 我已经用一些运行120秒的shell脚本测试了此调用。我期望子进程在30秒后被杀死,但是实际上该进程正在完成120秒脚本,然后引发了Timeout Exception。现在的问题是如何通过超时杀死子进程? 问题
在命令行中运行时,会出现以下失败 在肯定的情况下-报告说 null 谢谢你的帮助
问题内容: 假设我有一个进程,它恰好产生了一个子进程。现在,当父进程出于某种原因(正常或异常,通过kill,^ C,断言失败或其他任何原因)退出时,我希望子进程死亡。如何正确地做到这一点? 问题答案: 子进程可以通过在syscall中指定选项来要求父进程去世时内核发出(或其他信号),如下所示: 有关详细信息,请参见。 编辑:这是仅Linux
群集环境: Storm0.9.2 Zookeeper 3.4.6 Ubuntu 13.10