用c实现进程监控,如果某一进程退出则重启

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/types.h>  
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>



//要监控的程序
#define P1 "hello1"
#define P2 "hello2"
#define P3 "hello3"
#define PATH "."

/*****************************/
int is_run(char *name);
void killall_hello(void);
/*****************************/


//运行返回1,没有运行返回0
int is_run(char *name)
{
int ret = -1;
char buf[256] = {'\0'};
snprintf(buf, sizeof(buf), "pidof %s >> /dev/null", name); 
ret = system(buf);
if(!WEXITSTATUS(ret)){ //#include <sys/wait.h>
//printf("%s is running!\n", name);
return 1;
}
else{
//printf("%s is not running!\n", name);
return 0;
}
}
void killall_hello(void)
{


char buf[128] = {'\0'};
snprintf(buf, sizeof(buf), "killall %s", P1);
system(buf);
snprintf(buf, sizeof(buf), "killall %s", P2);
system(buf);
snprintf(buf, sizeof(buf), "killall %s", P3);
system(buf);

}


int main(int argc, char **argv)
{
int p1_ret = -1;
int p2_ret = -1;
    int p3_ret = -1;
char buf[128];
bzero(buf, sizeof(buf));


while(1){

p1_ret = is_run(P1);
p2_ret = is_run(P2);
p3_ret = is_run(P3);

if (!(p1_ret && p2_ret && p3_ret))
{
killall_hello(); 
printf("rerun hello3\n");
snprintf(buf, sizeof(buf), "%s/%s &", PATH, P3);
system(buf);

//打印日志信息
system("date >> w.log");
if(!p1_ret){
snprintf(buf, sizeof(buf), "echo %s not run , killall , run %s >> w.log", P1, P3);
system(buf);
}
else if(!p2_ret){
snprintf(buf, sizeof(buf), "echo %s not run , killall , run %s >> w.log", P2, P3);
system(buf);
}
else if(!p3_ret){
snprintf(buf, sizeof(buf), "echo %s not run , killall , run %s >> w.log", P3, P3);
system(buf);
}
}
sleep(5);
}
exit(0);
}

发布了36 篇原创文章 · 获赞 39 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/wuquan_1230/article/details/6877783