<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[[实践OK]用killall -0监控服务的注意事项]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Tue, 14 Nov 2017 02:58:36 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：MHA里面有的LVS有兄弟用这样一句，也不会LVS，好像是用来检测Mysql的进程否还活着的Shell，vrrp_script chk_mysqld &#123; script &quot;killall -0 mysqld &amp;&amp; exit 0 &#124;&#124; exit 1&quot;。这句是否完备，实践发现如果对于多进程模型，可能并不完备，如下实践。<br/><br/>后台服务需要不间断运行，意外退出后，需要将其重新拉起。常常可以通过向进程发送信号0，然后根据返回值来判断一个进程是否存在。比如进程名字为A，那么<br/>exsit=&quot;killall -0 A;echo $?&quot;<br/>exsit为0就表示进程A存在，否则表示不存在。<br/>然而，当有多个进程名字都是A的时候，只有在全部名字为A的进程都退出后，exsit才非0，所以这种监控方法并不太适合多进程环境(为了负载均衡，服务器常常采用多进程)。<br/><br/>我们来看例子。<br/>testbin.c<br/><textarea name="code" class="php" rows="15" cols="100">
#include &lt;stdint.h&gt;
#include&lt;iostream&gt;&nbsp;&nbsp;
#include&lt;sstream&gt;&nbsp;&nbsp;
#include&lt;string&gt;&nbsp;&nbsp;
#include&lt;sys/shm.h&gt;&nbsp;&nbsp;
#include&lt;sys/socket.h&gt;&nbsp;&nbsp;
#include&lt;sys/wait.h&gt;&nbsp;&nbsp;
#include&lt;sys/time.h&gt;&nbsp;&nbsp;
#include&lt;fcntl.h&gt;&nbsp;&nbsp;
#include&lt;time.h&gt;&nbsp;&nbsp;
#include&lt;unistd.h&gt;&nbsp;&nbsp;
#include&lt;sys/file.h&gt;&nbsp;&nbsp;
#include&lt;signal.h&gt;&nbsp;&nbsp;
#include&lt;vector&gt;&nbsp;&nbsp;
using namespace std;&nbsp;&nbsp;
&nbsp;&nbsp;
void sum_test()&nbsp;&nbsp;
&#123;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;int curpid=getpid();&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;&quot;summer &quot;&lt;&lt;curpid&lt;&lt;&quot; start.......&quot;&lt;&lt;endl;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;sleep(600);&nbsp;&nbsp;
&#125;&nbsp;&nbsp;
&nbsp;&nbsp;
int main()&nbsp;&nbsp;
&#123;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;&quot;Start.....&quot;&lt;&lt;endl;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;//////创建累加子进程&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;pid_t&gt; vsumprocess;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;uint32_t sumprocessnum=4;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;sumprocessnum;++i)&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid_t pid = fork();&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pid&lt;0)&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;&quot;failed to create process&quot;&lt;&lt;endl;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(0==pid)&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum_test();&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vsumprocess.push_back(pid);&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;////等待累加进程结束&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;for(vector&lt;pid_t&gt;::iterator iter=vsumprocess.begin();iter!=vsumprocess.end();iter++)&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid_t pid=waitpid(*iter,NULL,0);&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;&quot;sum child process &quot;&lt;&lt;pid&lt;&lt;&quot; over&quot;&lt;&lt;endl;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;
&nbsp;&nbsp;
&#125;&nbsp;&nbsp;

</textarea><br/>make testbin<br/>g++&nbsp;&nbsp;&nbsp;&nbsp; testbin.cpp&nbsp;&nbsp; -o testbin<br/><br/>然后我们运行他。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 1.启动父子总共5个进程。<br/> ./testbin <br/>Start.....<br/>summer 42187 start.......<br/>summer 42186 start.......<br/>summer 42185 start.......<br/>summer 42184 start.......<br/><br/>2.发送killall -0<br/>killall -0 testbin &amp;&amp; echo 0 &#124;&#124; echo 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>0<br/><br/>发现有进程接收了信号<br/><br/>3..杀掉一个子进程<br/>ps aux&#124;grep testbin<br/>root&nbsp;&nbsp;&nbsp;&nbsp; 45125&nbsp;&nbsp;0.0&nbsp;&nbsp;0.1&nbsp;&nbsp;11880&nbsp;&nbsp;1048 pts/0&nbsp;&nbsp;&nbsp;&nbsp;S+&nbsp;&nbsp; 10:52&nbsp;&nbsp; 0:00 ./testbin<br/>root&nbsp;&nbsp;&nbsp;&nbsp; 45126&nbsp;&nbsp;0.0&nbsp;&nbsp;0.0&nbsp;&nbsp;11748&nbsp;&nbsp; 392 pts/0&nbsp;&nbsp;&nbsp;&nbsp;S+&nbsp;&nbsp; 10:52&nbsp;&nbsp; 0:00 ./testbin<br/>root&nbsp;&nbsp;&nbsp;&nbsp; 45127&nbsp;&nbsp;0.0&nbsp;&nbsp;0.0&nbsp;&nbsp;11880&nbsp;&nbsp; 400 pts/0&nbsp;&nbsp;&nbsp;&nbsp;S+&nbsp;&nbsp; 10:52&nbsp;&nbsp; 0:00 ./testbin<br/>root&nbsp;&nbsp;&nbsp;&nbsp; 45128&nbsp;&nbsp;0.0&nbsp;&nbsp;0.0&nbsp;&nbsp;11880&nbsp;&nbsp; 400 pts/0&nbsp;&nbsp;&nbsp;&nbsp;S+&nbsp;&nbsp; 10:52&nbsp;&nbsp; 0:00 ./testbin<br/>root&nbsp;&nbsp;&nbsp;&nbsp; 45129&nbsp;&nbsp;0.0&nbsp;&nbsp;0.0&nbsp;&nbsp;11880&nbsp;&nbsp; 400 pts/0&nbsp;&nbsp;&nbsp;&nbsp;S+&nbsp;&nbsp; 10:52&nbsp;&nbsp; 0:00 ./testbin<br/><br/>kill -s 9 PID<br/>----------------<br/>kill -s 9 45125 <br/>kill -s 9 45126 <br/><br/>kill -s 9 45129<br/>killall -0 testbin &amp;&amp; echo 0 &#124;&#124; echo 1 <br/>0<br/><br/>killall -0 testbin &amp;&amp; echo 0 &#124;&#124; echo 1 <br/>0<br/><br/>最后还剩下一个进程了：<br/>ps aux&#124;grep testbin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>root&nbsp;&nbsp;&nbsp;&nbsp; 45128&nbsp;&nbsp;0.0&nbsp;&nbsp;0.0&nbsp;&nbsp;11880&nbsp;&nbsp; 400 pts/0&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;10:52&nbsp;&nbsp; 0:00 ./testbin<br/>killall -0 testbin &amp;&amp; echo 0 &#124;&#124; echo 1 <br/>0<br/><br/><br/>注意此时这个子进程成了僵尸进程。虽然现在只有4个进程，但是killall -0发出的信号仍然被接收，所以返回0.再杀一个，只剩3个所以仍然又能进程接收相关信号，返回0.<br/><br/>4..killall杀掉所有的父子进程<br/>kill -s 9 45128<br/><br/>此时没有进程接收信号，返回1.<br/>killall -0 testbin &amp;&amp; echo 0 &#124;&#124; echo 1 <br/>testbin: no process killed<br/>1<br/><br/><br/>实践源来自：http://blog.csdn.net/wjj547670933/article/details/44535761
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]用killall -0监控服务的注意事项]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>