转载,原文地址:https://blog.csdn.net/MINGTING1323/article/details/81906216
我们经常需要实现进程监控,如果某一进程异常退出或是跑飞则立即重启。通常使用的有2种方法:
一.supervisor来管理进程。
二.自己写程序来监管。
对于1而言,有些文件系统中不支持,需要移植安装。
对于2而言,不少都是单独写个监管程序,通过写入文件PID定时检查进程PID是否存在,或是查看是否有此进程名存在。个人觉得不太实用,遇到调试时或是其他操作时,灵活性太差。
本案是模仿supervisor,使用注册监控程序,来实现管控。功能予以实现如下:
1,每个进程往往有如下三个状态。
typedef enum _cmdType
{
cmdRegister, /*注册*/
cmdCancel, /*注销*/
cmdSuspend /*暂停*/
}cmdType_t;
2.进程管控结构体
typedef struct msgStruct{
cmdType_t cmdType; //命令类型
pid_t pid; //进程PID
char executablePath[MAX_PATH_LEN]; //进程执行路径
int argc; //参数个数
argStr argv[MAX_PARAM]; //参数
}msgStruct;
3.所进程带参数
typedef struct argStr_t{
char strSt[MAX_ARGV_LEN];
}argStr;
本案所使用的是消息队列进行通信,大家可以根据自己的需求进行更改。
异常处理:
- 如果程序注册监管时发现之前的PID或进程路径存在,kill掉之前的进程。
2.如果程序异常退出则根据路径,和参数重启进程。
3.如果程序取消,或是人为退出或暂停,则不重启该进程。
代码链接如下