我正在设计一个监控过程。监视进程的工作是监视一组已配置的进程。当监视进程检测到进程已关闭时,需要重新启动进程。
我正在为我的linux系统开发代码。这是我开发一个小型原型的方法 - 提供有关需要监控的各种流程的详细信息(路径,参数)。 - 监控过程执行以下操作: 1.为SIGCHLD安装了信号处理程序 2.一个fork和execv来启动要监视的进程。存储子进程的pid。 3.当孩子沮丧时,父母会收到SIGCHLD 4.现在将调用信号处理程序。处理程序将在先前存储的pids列表上运行for循环。对于每个pid,它将检查/ proc文件系统是否存在与pid相对应的目录。如果该目录不存在,则重新启动该进程。
现在,我的问题是这个 - 上面的方法(检查/ proc文件系统)是一个标准的或推荐的检查进程是否正在运行的机制,还是应该为ps命令创建管道并循环通过ps的输出? - 有更好的方法来实现我的要求吗?
问候。
答案 0 :(得分:4)
您不应该检查/proc
以确定哪个进程已退出 - 在此期间可能会启动另一个不相关的进程并巧合地分配相同的PID。
相反,在SIGCHLD
处理程序中,您应该使用waitpid()
系统调用,例如:
int status;
pid_t child;
while ((child = waitpid(-1, &status, WNOHANG)) > 0)
{
/* Process with PID 'child' has exited, handle it */
}
(需要循环,因为多个子进程可能会在短时间内退出,但可能只会导致一个SIGCHLD。)
答案 1 :(得分:2)
让我们看看我是否理解你。你有一个子列表,你在你的SIGCLD处理程序上运行/ proc循环,看看哪些孩子还活着,不是吗?
那不是很平常,......而且这很丑陋,
您通常在SIGCLD处理程序上运行while((pid = waitpid(-1, &status, WNOHANG)))
循环,并使用返回的pid和Wxxx宏来保持您的子列表最新。
请注意,wait()
和waitpid()
是异步信号安全的。您调用以检查/proc
的函数可能不是。
答案 2 :(得分:1)
查看supervisord。它很棒。
答案 3 :(得分:0)
通过向其pid发出kill()
系统调用,您可以轻松判断进程是否处于活动状态。如果孩子不活着,kill()
将不会成功。
此外,如果进程仍处于活动状态,则使用waitpid()
选项调用WNOHANG
将立即返回零。
恕我直言,阅读proc文件或管道到ps是一种讨厌的方法。