分叉并忽略子退出状态

ova*_*gle 1 python linux posix

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

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

那么,有没有办法 fork 一个子进程,这样我就不需要检查退出状态,或者我只需要处理我的进程表被僵尸填满?

Jon*_*ler 6

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

在 C 中,您将使用:

signal(SIGCHLD, SIG_IGN);
Run Code Online (Sandbox Code Playgroud)

您需要使其适应 Python 界面。

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

import signal

signal.signal(signal.SIGCHLD, signal.SIG_IGN)
Run Code Online (Sandbox Code Playgroud)

请参阅:POSIX信号概念以了解底层系统行为(特别是“信号操作”和SIG_IGN该部分下)。

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