设计用于监视和重新启动进程的监视进程

时间:2010-11-08 17:39:11

标签: c process unix

我正在设计一个监控过程。监视进程的工作是监视一组已配置的进程。当监视进程检测到进程已关闭时,需要重新启动进程。

我正在为我的linux系统开发代码。这是我开发一个小型原型的方法 - 提供有关需要监控的各种流程的详细信息(路径,参数)。 - 监控过程执行以下操作: 1.为SIGCHLD安装了信号处理程序 2.一个fork和execv来启动要监视的进程。存储子进程的pid。 3.当孩子沮丧时,父母会收到SIGCHLD 4.现在将调用信号处理程序。处理程序将在先前存储的pids列表上运行for循环。对于每个pid,它将检查/ proc文件系统是否存在与pid相对应的目录。如果该目录不存在,则重新启动该进程。

现在,我的问题是这个 - 上面的方法(检查/ proc文件系统)是一个标准的或推荐的检查进程是否正在运行的机制,还是应该为ps命令创建管道并循环通过ps的输出? - 有更好的方法来实现我的要求吗?

问候。

4 个答案:

答案 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是一种讨厌的方法。