我正在设计一个监控过程。监控进程的工作是监控几组已配置的进程。当监控进程检测到某个进程宕机时,需要重启该进程。
我正在为我的 linux 系统开发代码。这是我开发小型原型(prototype)的方法
- 提供有关需要监控的各种进程的详细信息(路径、参数)。 - 监控进程做了以下事情:
1. 为 SIGCHLD 安装信号处理程序
2.一个fork和execv来启动被监控的进程。存储子进程的pid。
3.当 child 宕机时, parent 收到一个SIGCHLD
4. 现在将调用信号处理程序。处理程序将在之前存储的 pid 列表上运行 for 循环。对于每个 pid,它将检查/proc 文件系统是否存在与该 pid 对应的目录。如果该目录不存在,则重新启动该过程。
现在,我的问题是
- 上述方法(检查/proc 文件系统)是检查进程是否正在运行的标准或推荐机制,还是我应该为 ps 命令创建管道并循环遍历 ps 的输出?
- 有没有更好的方法来满足我的要求?
问候。
最佳答案
你不应该检查 /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)。
关于c - 设计一个监控进程来监控和重启进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4126401/