分叉并忽略子退出状态

时间:2014-07-08 17:26:37

标签: python linux posix

当前正在编写一个自动更新多个长时间运行程序的守护进程。我不关心程序的退出状态,因为孩子退出的唯一方法是在升级时强行退出。不幸的是,我因此创造了大量的僵尸进程。

我知道我可以使用waitpid(0, WNOHANG)来监听来自任何一个孩子的变化(这几乎就是我想要的),但是我也使用python多处理模块来并行运行多个单独的升级过程,因此我可以运行waitpid的长时间运行过程实际上是已终止进程的祖父,因此它永远不会收到任何信号。

那么,有没有办法分叉一个子进程,以便我永远不需要检查退出状态,或者我只需要处理我的进程表中充满了僵尸?

2 个答案:

答案 0 :(得分:4)

您应该能够通过SIGCHLD信号处理程序的设置来控制它。

在C中,您将使用:

signal(SIGCHLD, SIG_IGN);

您需要将其改编为Python界面。

您可以使用Python 2 signal或Python 3 signal模块;对于手头的问题,它们似乎完全相同:

import signal

signal.signal(signal.SIGCHLD, signal.SIG_IGN)

请参阅:POSIX Signal Concepts了解基础系统行为(特别是该部分下的'信号操作'和SIG_IGN)。

警告:Python代码未经过正式测试!

答案 1 :(得分:0)

据我了解您的流程树布局,它看起来如下所示,其中parent1parent2是使用Python multiprocessing.Process对象的东西。

grandparent
 |- parent1
   |- child1
   |- child2
 |- parent2
   | - child1
   | - child2

如果是这种情况,您需要确保在各自的主流程(即multiprocessing.Process.joinparent1)上调用parent2儿童。一旦他们终止,无论原因如何,他们都将被清理,这将允许grandparent优雅地清理parent1parent2

如果您希望向父级添加其他逻辑以循环浏览所有子级进程而不是阻止第一个子进程,则可以使用https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.join中提到的timeout kwarg超时你的加入。