背景: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
后台服务需要不间断运行,意外退出后,需要将其重新拉起。常常可以通过向进程发送信号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/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
评论列表