Python Fork和ignore子退出状态
当前正在编写自动更新多个长时间运行的程序的守护进程时。我不关心程序的退出状态,因为孩子退出的唯一方式是在升级时强制退出。不幸的是,我因此创建了大量僵尸进程 我知道我可以使用Python Fork和ignore子退出状态,python,linux,posix,Python,Linux,Posix,当前正在编写自动更新多个长时间运行的程序的守护进程时。我不关心程序的退出状态,因为孩子退出的唯一方式是在升级时强制退出。不幸的是,我因此创建了大量僵尸进程 我知道我可以使用waitpid(0,WNOHANG)来监听任何子级的更改(这几乎正是我想要的),但是我也使用python多处理模块并行运行多个单独的升级过程,因此,我可以从中运行的长时间运行的进程实际上是终止进程的祖父母,因此它从不接收任何信号 那么,是否有任何方法可以分叉子进程,这样我就不需要检查退出状态,或者我只需要处理我的进程表中充满了
waitpid(0,WNOHANG)
来监听任何子级的更改(这几乎正是我想要的),但是我也使用python多处理模块并行运行多个单独的升级过程,因此,我可以从中运行的长时间运行的进程实际上是终止进程的祖父母,因此它从不接收任何信号
那么,是否有任何方法可以分叉子进程,这样我就不需要检查退出状态,或者我只需要处理我的进程表中充满了僵尸?您应该能够通过设置SIGCHLD的信号处理程序来控制这一点 在C中,您将使用:
signal(SIGCHLD, SIG_IGN);
您需要将其适应Python接口
您可以使用Python2或Python3模块;对于手头的问题,它们似乎是相同的:
import signal
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
请参阅:POSIX了解基本系统行为(特别是该部分下的“信号动作”和SIG_IGN
)
警告:Python代码未经过正式测试 您应该能够通过设置SIGCHLD的信号处理程序来控制这一点 在C中,您将使用:
signal(SIGCHLD, SIG_IGN);
您需要将其适应Python接口
您可以使用Python2或Python3模块;对于手头的问题,它们似乎是相同的:
import signal
signal.signal(signal.SIGCHLD, signal.SIG_IGN)
请参阅:POSIX了解基本系统行为(特别是该部分下的“信号动作”和SIG_IGN
)
警告:Python代码未经过正式测试 据我所知,您的流程树布局如下所示,其中
parent1
和parent2
是使用Python的多处理.process
对象的东西
grandparent
|- parent1
|- child1
|- child2
|- parent2
| - child1
| - child2
如果是这种情况,您需要确保从父进程(即,parent1
和parent2
)对其各自的子进程调用multiprocessing.Process.join
。一旦他们终止,不管原因如何,他们都将被清理,这将允许祖父母
优雅地清理父母1
和父母2
如果您想向父进程添加额外的逻辑来循环所有子进程,而不是阻塞第一个进程,则可以使用在中提到的
超时kwarg来超时加入。据我所知,进程树布局如下所示,其中parent1
和parent2
是使用Python的多处理.Process
对象的东西
grandparent
|- parent1
|- child1
|- child2
|- parent2
| - child1
| - child2
如果是这种情况,您需要确保从父进程(即,parent1
和parent2
)对其各自的子进程调用multiprocessing.Process.join
。一旦他们终止,不管原因如何,他们都将被清理,这将允许祖父母
优雅地清理父母1
和父母2
如果您想向父进程添加额外的逻辑,以循环所有子进程,而不是阻塞第一个进程,则可以使用在中提到的timeout
kwarg来超时加入