在新会话中启动进程可以立即杀死所有树

时间:2013-06-21 16:01:06

标签: linux session puppet kill process-group

有一个面向Linux的Python程序正在启动Puppet子进程。 Puppet是一个配置管理软件,在执行它时会启动许多子进程(yum,curl,自定义脚本等).Python代码有一个看门狗,如果它运行的时间太长,就会杀死puppet子进程。在当前版本中,它使用os.kill来做到这一点。 问题是当木偶进程在超时时被杀死,它的孤儿子被附加到“init”并继续运行。通常这些孩子是超时的最初原因。

第一次尝试会杀死整个进程组(os.killpg)。但是,使用OSError(3,“没有这样的过程”),kill调用失败了。在研究了流程管理文档后,我理解它不起作用,因为puppet本身在一个单独的进程组中启动ruby进程。此外,进程组不会被子进程继承,因此os.killpg无论如何也无济于事。是的,POSIX允许设置具有一些限制的子项的PGID,但它需要迭代监视新的子进程,在我的情况下看起来像黑客。

下一次尝试在一个单独的shell(“sh -c”)/“su”环境/ setsid(各种组合)中运行Puppet。期望的结果是在新会话中启动此过程(和子项)。我希望它可以模拟远程ssh连接断开的东西:向会话负责人发送SIGHUP,例如puppet进程,将SIGHUP发送给整个孩子树。所以我将能够杀死整棵树。通过远程SSH连接运行puppet的实验表明,这种方法似乎有效:所有进程在终端断开后死亡。我还没有从Python中实现这种行为。 这种方法是否正确,我是否遗漏了某些东西,或者这是一个丑陋的黑客?

另一种方法我看到将SIGSTOP发送到树中的每个进程(迭代,而树中至少有一个正在运行的进程以避免竞争条件),然后单独终止每个进程。这种方法可行,但看起来不太优雅。

问题与Python代码无关,当从控制台运行“puppet apply”并使用“kill”命令发送信号时,它也会重现。

是的,我知道Puppet有一个“超时”关键字用于描述目的,但我正在寻找一个更通用的解决方案,不仅适用于Puppet,也适用于任何富有成效的子流程。

0 个答案:

没有答案