[实践OK]用killall -0监控服务的注意事项

jackxiang 2017-11-14 10:58 | |
背景: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

make testbin
g++     testbin.cpp   -o testbin

然后我们运行他。
     1.启动父子总共5个进程。
./testbin
Start.....
summer 42187 start.......
summer 42186 start.......
summer 42185 start.......
summer 42184 start.......

2.发送killall -0
killall -0 testbin && echo 0 || echo 1          
0

发现有进程接收了信号

3..杀掉一个子进程
ps aux|grep testbin
root     45125  0.0  0.1  11880  1048 pts/0    S+   10:52   0:00 ./testbin
root     45126  0.0  0.0  11748   392 pts/0    S+   10:52   0:00 ./testbin
root     45127  0.0  0.0  11880   400 pts/0    S+   10:52   0:00 ./testbin
root     45128  0.0  0.0  11880   400 pts/0    S+   10:52   0:00 ./testbin
root     45129  0.0  0.0  11880   400 pts/0    S+   10:52   0:00 ./testbin

kill -s 9 PID
----------------
kill -s 9 45125
kill -s 9 45126

kill -s 9 45129
killall -0 testbin && echo 0 || echo 1
0

killall -0 testbin && echo 0 || echo 1
0

最后还剩下一个进程了:
ps aux|grep testbin                    
root     45128  0.0  0.0  11880   400 pts/0    S    10:52   0:00 ./testbin
killall -0 testbin && echo 0 || echo 1
0


注意此时这个子进程成了僵尸进程。虽然现在只有4个进程,但是killall -0发出的信号仍然被接收,所以返回0.再杀一个,只剩3个所以仍然又能进程接收相关信号,返回0.

4..killall杀掉所有的父子进程
kill -s 9 45128

此时没有进程接收信号,返回1.
killall -0 testbin && echo 0 || echo 1
testbin: no process killed
1


实践源来自:http://blog.csdn.net/wjj547670933/article/details/44535761

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/9517/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!

评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]