标题:[实践OK]用killall -0监控服务的注意事项 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Tue, 14 Nov 2017 10:58:36 +0000 作者:jackxiang 地址:https://jackxiang.com/post/9517/ 内容: 背景:MHA里面有的LVS有兄弟用这样一句,也不会LVS,好像是用来检测Mysql的进程否还活着的Shell,vrrp_script chk_mysqld { script "killall -0 mysqld && exit 0 || exit 1"。这句是否完备,实践发现如果对于多进程模型,可能并不完备,如下实践。 后台服务需要不间断运行,意外退出后,需要将其重新拉起。常常可以通过向进程发送信号0,然后根据返回值来判断一个进程是否存在。比如进程名字为A,那么 exsit="killall -0 A;echo $?" exsit为0就表示进程A存在,否则表示不存在。 然而,当有多个进程名字都是A的时候,只有在全部名字为A的进程都退出后,exsit才非0,所以这种监控方法并不太适合多进程环境(为了负载均衡,服务器常常采用多进程)。 我们来看例子。 testbin.c #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; void sum_test() { int curpid=getpid(); cout<<"summer "< vsumprocess; uint32_t sumprocessnum=4; for(int i=0;i::iterator iter=vsumprocess.begin();iter!=vsumprocess.end();iter++) { pid_t pid=waitpid(*iter,NULL,0); cout<<"sum child process "<