linux下监控进程是否挂掉的一种方法
(2013-01-22 10:21:15)
有的服务器进程都要求持续无间断的工作,但是有时在高并发,长时间的压力下,服务器进程可能会出现一些意想不到的错误,例如常见的内存非法访问的错误,而导致程序直接挂掉。所以,有时候对进程进行实时监控,当发现进程挂掉时,立刻重新启动进程,也是一种可以救急的方式(当然这个只是一种临时救急,并不是根本解决方法)。
实现方式:
使用fork()创建子进程,子进程用于执行具体功能,主进程只是用于监控子进程,当主进程检测到子进程挂掉后,可以实现立即重新启动子进程。
子进程结束,系统会向主进程发送信号:SIGCHLD,主进程可以通过捕捉该信号,从而检测子进程已经不存在,进而继续下一步操作。如果需要,主进程还可以获得子进程是为何退出的。
源代码例子:
#include
#include
#include
#include
#include
#include
#include
void process_exit(int s)
{
exit(0);
}
void child_fun()
{
printf("child_fun. ppid %d\n",getppid());
char *st =
NULL;
strcpy(st,
"123");
}
void fork_child()
{
pid_t
child_process;
int
status;
int
signal_num;
wait(&status);//等待子进程中断或终止,释放子进程资源,否则死掉的子进程会变成僵尸进程
//如果子进程是由于某种信号退出的,捕获该信号
if(WIFSIGNALED(status))
signal_num = WTERMSIG(status);
child_process = fork();
if(child_process == 0)
{
printf("fork new child process.\n");
child_fun();
}
}
int main()
{
pid_t
child_process;
int i =
0;
while(1)
{
printf("fork new process.\n");
child_process = fork();
if(child_process > 0)
{
while(1)
{
//捕获子进程结束信号
signal(SIGCHLD, fork_child);
signal(SIGTERM, process_exit);
pause();//主进程休眠,当有信号到来时被唤醒。
}
}
else if(child_process == 0)
{
child_fun();