详解Linux监控重要进程的实现方法
<p>不管后台服务程序写的多么健壮,还是可能会出现core dump等程序异常退出的情况,但是一般情况下需要在无</p>
<p>
人为干预情况下,能够自动重新启动,保证服务进程能够服务用户。这时就需要一个监控程序来实现能够让服务进程自动重新启动。查阅相关资料及尝试一些方法之后,总结linux系统监控重要进程的实现方法:脚本检测和子进程替换。</p>
<p>
<strong>1、脚本检测</strong></p>
<p>
(1) 基本思路: 通过shell命令(ps -e | grep "$1" | grep -v "grep" | wc -l) 获取 $1 ($1 代表进程的名字)的进程数,脚本根据进程数来决定下一步的操作。通过一个死循环,每隔几秒检查一次系统中的指定程序的进程数,这里也可使用crontab来实现。</p>
<p>
(2) 具体实现过程的代码如下: [ supervisor.sh ]</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_495541">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash preprocessor bold">#! /bin/sh </code>
</div>
<div class="line number2 index1 alt1">
<code class="bash comments"># supervisor process </code>
</div>
<div class="line number3 index2 alt2">
<code class="bash spaces"> </code>
</div>
<div class="line number4 index3 alt1">
<code class="bash plain">LOG_FILE=</code><code class="bash plain">/var/log/supervisor_sh</code><code class="bash plain">.log </code>
</div>
<div class="line number5 index4 alt2">
<code class="bash spaces"> </code>
</div>
<div class="line number6 index5 alt1">
<code class="bash comments"># log function </code>
</div>
<div class="line number7 index6 alt2">
<code class="bash keyword">function</code> <code class="bash plain">log() { </code>
</div>
<div class="line number8 index7 alt1">
<code class="bash spaces"> </code><code class="bash functions">local</code> <code class="bash plain">t=$(</code><code class="bash functions">date</code> <code class="bash plain">+</code><code class="bash string">"%F %X"</code><code class="bash plain">) </code>
</div>
<div class="line number9 index8 alt2">
<code class="bash spaces"> </code><code class="bash functions">echo</code> <code class="bash string">"[ $t ] $0 : $1 "</code> <code class="bash plain">>> ${LOG_FILE} </code>
</div>
<div class="line number10 index9 alt1">
<code class="bash plain">} </code>
</div>
<div class="line number11 index10 alt2">
<code class="bash spaces"> </code>
</div>
<div class="line number12 index11 alt1">
<code class="bash comments"># check process number </code>
</div>
<div class="line number13 index12 alt2">
<code class="bash comments"># $1 : process name </code>
</div>
<div class="line number14 index13 alt1">
<code class="bash keyword">function</code> <code class="bash plain">check_process() { </code>
</div>
<div class="line number15 index14 alt2">
<code class="bash spaces"> </code><code class="bash keyword">if</code> <code class="bash plain">[ -z $1 ]; </code><code class="bash keyword">then</code>
</div>
<div class="line number16 index15 alt1">
<code class="bash spaces"> </code><code class="bash plain">log </code><code class="bash string">"Input parameter is empty."</code>
</div>
<div class="line number17 index16 alt2">
<code class="bash spaces"> </code><code class="bash keyword">return</code> <code class="bash plain">0 </code>
</div>
<div class="line number18 index17 alt1">
<code class="bash spaces"> </code><code class="bash keyword">fi</code>
</div>
<div class="line number19 index18 alt2">
<code class="bash spaces"> </code>
</div>
<div class="line number20 index19 alt1">
<code class="bash spaces"> </code><code class="bash plain">p_num=$(</code><code class="bash functions">ps</code> <code class="bash plain">-e | </code><code class="bash functions">grep</code> <code class="bash string">"$1"</code> <code class="bash plain">| </code><code class="bash functions">grep</code> <code class="bash plain">-</code><code class="bash functions">v</code> <code class="bash string">"grep"</code> <code class="bash plain">| </code><code class="bash functions">wc</code> <code class="bash plain">-l) </code>
</div>
<div class="line number21 index20 alt2">
<code class="bash spaces"> </code><code class="bash plain">log </code><code class="bash string">"p_num = $p_num"</code>
</div>
<div class="line number22 index21 alt1">
<code class="bash spaces"> </code><code class="bash functions">echo</code> <code class="bash plain">$p_num </code>
</div>
<div class="line number23 index22 alt2">
<code class="bash plain">} </code>
</div>
<div class="line number24 index23 alt1">
<code class="bash spaces"> </code>
</div>
<div class="line number25 index24 alt2">
<code class="bash comments"># supervisor process </code>
</div>
<div class="line number26 index25 alt1">
<code class="bash keyword">while</code> <code class="bash plain">[ 1 ] </code>
</div>
<div class="line number27 index26 alt2">
<code class="bash keyword">do</code>
</div>
<div class="line number28 index27 alt1">
<code class="bash spaces"> </code><code class="bash functions">declare</code> <code class="bash plain">-i ch_num </code>
</div>
<div class="line number29 index28 alt2">
<code class="bash spaces"> </code><code class="bash plain">p_name=</code><code class="bash string">"apache2"</code>
</div>
<div class="line number30 index29 alt1">
<code class="bash spaces"> </code><code class="bash plain">ch_num=$(check_process $p_name) </code>
</div>
<div class="line number31 index30 alt2">
<code class="bash spaces"> </code><code class="bash keyword">if</code> <code class="bash plain">[ $ch_num -</code><code class="bash keyword">eq</code> <code class="bash plain">0 ]; </code><code class="bash keyword">then</code>
</div>
<div class="line number32 index31 alt1">
<code class="bash spaces"> </code><code class="bash plain">killall $p_name </code>
</div>
<div class="line number33 index32 alt2">
<code class="bash spaces"> </code><code class="bash plain">service $p_name start </code>
</div>
<div class="line number34 index33 alt1">
<code class="bash spaces"> </code><code class="bash keyword">fi</code>
</div>
<div class="line number35 index34 alt2">
<code class="bash spaces"> </code><code class="bash functions">sleep</code> <code class="bash plain">3 </code>
</div>
<div class="line number36 index35 alt1">
<code class="bash keyword">done</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>2、子进程替换</strong></p>
<p>
(1) 基本思路:</p>
<p>
a. 使用fork函数创建一个新的进程,在进程表中创建一个新的表项,而创建者(即父进程)按原来的流程继续执行,子进程执行自己的控制流程</p>
<p>
b. 运用execv函数把当前进程替换为一个新的进程,新进程由path或file参数指定,可以使用execv函数将程序的执行从一个程序切换到另一个程序</p>
<p>
c. 当fork启动一个子进程时,子进程就有了它自己的生命周期并将独立运行,此时可以在父进程中调用wait函数让父进程等待子进程的结束</p>
<p>
(2) 基本的实现步骤:</p>
<p>
a. 首先使用fork系统调用,创建子进程</p>
<p>
b. 在子进程中使用execv函数,执行需要自动重启的程序</p>
<p>
c. 在父进程中执行wait函数等待子进程的结束,然后重新创建一个新的子进程</p>
<p>
(3) 具体实现的代码如下: supervisor.c</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_961267">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
<div class="line number39 index38 alt2">
39</div>
<div class="line number40 index39 alt1">
40</div>
<div class="line number41 index40 alt2">
41</div>
<div class="line number42 index41 alt1">
42</div>
<div class="line number43 index42 alt2">
43</div>
<div class="line number44 index43 alt1">
44</div>
<div class="line number45 index44 alt2">
45</div>
<div class="line number46 index45 alt1">
46</div>
<div class="line number47 index46 alt2">
47</div>
<div class="line number48 index47 alt1">
48</div>
<div class="line number49 index48 alt2">
49</div>
<div class="line number50 index49 alt1">
50</div>
<div class="line number51 index50 alt2">
51</div>
<div class="line number52 index51 alt1">
52</div>
<div class="line number53 index52 alt2">
53</div>
<div class="line number54 index53 alt1">
54</div>
<div class="line number55 index54 alt2">
55</div>
<div class="line number56 index55 alt1">
56</div>
<div class="line number57 index56 alt2">
57</div>
<div class="line number58 index57 alt1">
58</div>
<div class="line number59 index58 alt2">
59</div>
<div class="line number60 index59 alt1">
60</div>
<div class="line number61 index60 alt2">
61</div>
<div class="line number62 index61 alt1">
62</div>
<div class="line number63 index62 alt2">
63</div>
<div class="line number64 index63 alt1">
64</div>
<div class="line number65 index64 alt2">
65</div>
<div class="line number66 index65 alt1">
66</div>
<div class="line number67 index66 alt2">
67</div>
<div class="line number68 index67 alt1">
68</div>
<div class="line number69 index68 alt2">
69</div>
<div class="line number70 index69 alt1">
70</div>
<div class="line number71 index70 alt2">
71</div>
<div class="line number72 index71 alt1">
72</div>
<div class="line number73 index72 alt2">
73</div>
<div class="line number74 index73 alt1">
74</div>
<div class="line number75 index74 alt2">
75</div>
<div class="line number76 index75 alt1">
76</div>
<div class="line number77 index76 alt2">
77</div>
<div class="line number78 index77 alt1">
78</div>
<div class="line number79 index78 alt2">
79</div>
<div class="line number80 index79 alt1">
80</div>
<div class="line number81 index80 alt2">
81</div>
<div class="line number82 index81 alt1">
82</div>
<div class="line number83 index82 alt2">
83</div>
<div class="line number84 index83 alt1">
84</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp comments">/** </code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* </code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">* supervisor </code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">* date: 2016-08-10 </code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* </code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">*/</code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp preprocessor">#include <stdio.h> </code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp preprocessor">#include <unistd.h> </code>
</div>
<div class="line number11 index10 alt2">
<code class="cpp preprocessor">#include <errno.h> </code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp preprocessor">#include <string.h> </code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp preprocessor">#include <sys/types.h> </code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp preprocessor">#include <sys/wait.h> </code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp preprocessor">#include <stdlib.h> </code>
</div>
<div class="line number16 index15 alt1">
<code class="cpp preprocessor">#include <time.h> </code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp preprocessor">#define LOG_FILE "/var/log/supervisor.log" </code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number20 index19 alt1">
<code class="cpp keyword bold">void</code> <code class="cpp plain">s_log(</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*text) { </code>
</div>
<div class="line number21 index20 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">time_t</code> <code class="cpp plain">t; </code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp color1 bold">tm</code> <code class="cpp plain">*</code><code class="cpp color1 bold">tm</code><code class="cpp plain">; </code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*log_file; </code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp spaces"> </code><code class="cpp color1 bold">FILE</code> <code class="cpp plain">*fp_log; </code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">date; </code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">log_file = LOG_FILE; </code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">fp_log = </code><code class="cpp functions bold">fopen</code><code class="cpp plain">(log_file, </code><code class="cpp string">"a+"</code><code class="cpp plain">); </code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(NULL == fp_log) { </code>
</div>
<div class="line number30 index29 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stderr, </code><code class="cpp string">"Could not open logfile '%s' for writing\n"</code><code class="cpp plain">, log_file); </code>
</div>
<div class="line number31 index30 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number32 index31 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number33 index32 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">time</code><code class="cpp plain">(&t); </code>
</div>
<div class="line number34 index33 alt1">
<code class="cpp spaces"> </code><code class="cpp color1 bold">tm</code> <code class="cpp plain">= </code><code class="cpp functions bold">localtime</code><code class="cpp plain">(&t); </code>
</div>
<div class="line number35 index34 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">strftime</code><code class="cpp plain">(date, 127, </code><code class="cpp string">"%Y-%m-%d %H:%M:%S"</code><code class="cpp plain">, </code><code class="cpp color1 bold">tm</code><code class="cpp plain">); </code>
</div>
<div class="line number36 index35 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number37 index36 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">/* write the message to stdout and/or logfile */</code> </div>
<div class="line number38 index37 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(fp_log, </code><code class="cpp string">"[%s] %s\n"</code><code class="cpp plain">, date, text); </code>
</div>
<div class="line number39 index38 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">fflush</code><code class="cpp plain">(fp_log); </code>
</div>
<div class="line number40 index39 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">fclose</code><code class="cpp plain">(fp_log); </code>
</div>
<div class="line number41 index40 alt2">
<code class="cpp plain">} </code>
</div>
<div class="line number42 index41 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number43 index42 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">argc, </code><code class="cpp color1 bold">char</code> <code class="cpp plain">**argv) { </code>
</div>
<div class="line number44 index43 alt1">
<code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">ret, i, status; </code>
</div>
<div class="line number45 index44 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*child_argv = {0}; </code>
</div>
<div class="line number46 index45 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">pid_t pid; </code>
</div>
<div class="line number47 index46 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(argc < 2) { </code>
</div>
<div class="line number48 index47 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stderr, </code><code class="cpp string">"Usage:%s <exe_path> <args...>"</code><code class="cpp plain">, argv); </code>
</div>
<div class="line number49 index48 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1; </code>
</div>
<div class="line number50 index49 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number51 index50 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number52 index51 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">for</code> <code class="cpp plain">(i = 1; i < argc; ++i) { </code>
</div>
<div class="line number53 index52 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">child_argv = (</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*)</code><code class="cpp functions bold">malloc</code><code class="cpp plain">(</code><code class="cpp functions bold">strlen</code><code class="cpp plain">(argv)+1); </code>
</div>
<div class="line number54 index53 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">strncpy</code><code class="cpp plain">(child_argv, argv, </code><code class="cpp functions bold">strlen</code><code class="cpp plain">(argv)); </code>
</div>
<div class="line number55 index54 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">//child_argv)] = '0'; </code>
</div>
<div class="line number56 index55 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number57 index56 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number58 index57 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">while</code><code class="cpp plain">(1) { </code>
</div>
<div class="line number59 index58 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">pid = fork(); </code>
</div>
<div class="line number60 index59 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(pid == -1) { </code>
</div>
<div class="line number61 index60 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stderr, </code><code class="cpp string">"fork() error.errno:%d error:%s"</code><code class="cpp plain">, </code><code class="cpp functions bold">errno</code><code class="cpp plain">, </code><code class="cpp functions bold">strerror</code><code class="cpp plain">(</code><code class="cpp functions bold">errno</code><code class="cpp plain">)); </code>
</div>
<div class="line number62 index61 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
<div class="line number63 index62 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number64 index63 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(pid == 0) { </code>
</div>
<div class="line number65 index64 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">s_log(child_argv); </code>
</div>
<div class="line number66 index65 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">ret = execv(child_argv, (</code><code class="cpp color1 bold">char</code> <code class="cpp plain">**)child_argv); </code>
</div>
<div class="line number67 index66 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">s_log(</code><code class="cpp string">"execv return"</code><code class="cpp plain">); </code>
</div>
<div class="line number68 index67 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(ret < 0) { </code>
</div>
<div class="line number69 index68 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stderr, </code><code class="cpp string">"execv ret:%d errno:%d error:%s"</code><code class="cpp plain">, ret, </code><code class="cpp functions bold">errno</code><code class="cpp plain">, </code><code class="cpp functions bold">strerror</code><code class="cpp plain">(</code><code class="cpp functions bold">errno</code><code class="cpp plain">)); </code>
</div>
<div class="line number70 index69 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">continue</code><code class="cpp plain">; </code>
</div>
<div class="line number71 index70 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number72 index71 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">s_log(</code><code class="cpp string">"exit child process"</code><code class="cpp plain">); </code>
</div>
<div class="line number73 index72 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">exit</code><code class="cpp plain">(0); </code>
</div>
<div class="line number74 index73 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number75 index74 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(pid > 0) { </code>
</div>
<div class="line number76 index75 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">pid = wait(&status); </code>
</div>
<div class="line number77 index76 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stdout, </code><code class="cpp string">"Child process id: %d\n"</code><code class="cpp plain">, pid); </code>
</div>
<div class="line number78 index77 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">//fprintf(stdout, "wait return"); </code>
</div>
<div class="line number79 index78 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">s_log(</code><code class="cpp string">"Wait child process return"</code><code class="cpp plain">); </code>
</div>
<div class="line number80 index79 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number81 index80 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number82 index81 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number83 index82 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
<div class="line number84 index83 alt1">
<code class="cpp plain">} </code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
(4) 测试验证</p>
<p>
a. 假设需要自动重启的程序为demo.c,其代码实现如下所示:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_73140">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
<div class="line number39 index38 alt2">
39</div>
<div class="line number40 index39 alt1">
40</div>
<div class="line number41 index40 alt2">
41</div>
<div class="line number42 index41 alt1">
42</div>
<div class="line number43 index42 alt2">
43</div>
<div class="line number44 index43 alt1">
44</div>
<div class="line number45 index44 alt2">
45</div>
<div class="line number46 index45 alt1">
46</div>
<div class="line number47 index46 alt2">
47</div>
<div class="line number48 index47 alt1">
48</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp comments">/* </code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp comments">* </code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp comments">* demo </code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp comments">* </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp comments">*/</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp preprocessor">#include <stdio.h> </code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp preprocessor">#include <unistd.h> </code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp preprocessor">#include <errno.h> </code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp preprocessor">#include <string.h> </code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp preprocessor">#include <sys/types.h> </code>
</div>
<div class="line number11 index10 alt2">
<code class="cpp preprocessor">#include <sys/wait.h> </code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp preprocessor">#include <stdlib.h> </code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp preprocessor">#include <time.h> </code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp preprocessor">#define LOG_FILE "/var/log/demo.log" </code>
</div>
<div class="line number16 index15 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp keyword bold">void</code> <code class="cpp plain">demo_log(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">num) { </code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp spaces"> </code><code class="cpp color1 bold">time_t</code> <code class="cpp plain">t; </code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp color1 bold">tm</code> <code class="cpp plain">*</code><code class="cpp color1 bold">tm</code><code class="cpp plain">; </code>
</div>
<div class="line number20 index19 alt1">
<code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*log_file; </code>
</div>
<div class="line number21 index20 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">FILE</code> <code class="cpp plain">*fp_log; </code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">date; </code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">log_file = LOG_FILE; </code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">fp_log = </code><code class="cpp functions bold">fopen</code><code class="cpp plain">(log_file, </code><code class="cpp string">"a+"</code><code class="cpp plain">); </code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(NULL == fp_log) { </code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(stderr, </code><code class="cpp string">"Could not open logfile '%s' for writing\n"</code><code class="cpp plain">, log_file); </code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number30 index29 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">time</code><code class="cpp plain">(&t); </code>
</div>
<div class="line number31 index30 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">tm</code> <code class="cpp plain">= </code><code class="cpp functions bold">localtime</code><code class="cpp plain">(&t); </code>
</div>
<div class="line number32 index31 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">strftime</code><code class="cpp plain">(date,127,</code><code class="cpp string">"%Y-%m-%d %H:%M:%S"</code><code class="cpp plain">,</code><code class="cpp color1 bold">tm</code><code class="cpp plain">); </code>
</div>
<div class="line number33 index32 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number34 index33 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">/* write the message to stdout and/or logfile */</code> </div>
<div class="line number35 index34 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">fprintf</code><code class="cpp plain">(fp_log, </code><code class="cpp string">"[%s] num = %d\n"</code><code class="cpp plain">, date, num); </code>
</div>
<div class="line number36 index35 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">fflush</code><code class="cpp plain">(fp_log); </code>
</div>
<div class="line number37 index36 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">fclose</code><code class="cpp plain">(fp_log); </code>
</div>
<div class="line number38 index37 alt1">
<code class="cpp plain">} </code>
</div>
<div class="line number39 index38 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number40 index39 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">argc, </code><code class="cpp color1 bold">char</code> <code class="cpp plain">**argv[]) { </code>
</div>
<div class="line number41 index40 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">num = 0; </code>
</div>
<div class="line number42 index41 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number43 index42 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">while</code><code class="cpp plain">(1) { </code>
</div>
<div class="line number44 index43 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">sleep(10); </code>
</div>
<div class="line number45 index44 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">num++; </code>
</div>
<div class="line number46 index45 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">demo_log(num); </code>
</div>
<div class="line number47 index46 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number48 index47 alt1">
<code class="cpp plain">} </code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
b. 测试准备和说明:</p>
<p>
b1. 以上相关服务程序编译后的二进制文件为: supervisor 和 demo</p>
<p>
b2. 执行如下测试命令 ./supervisor ./demo </p>
<p>
c. 测试的结果:</p>
<p>
c1. execv(progname, arg) 执行成功后,其后的代码不会执行;只有当执行错误时,才会返回 -1。原来调用execv进程的代码段会被progname应用程序的代码段替换。</p>
<p>
c2. 当kill掉子进程时,父进程wait函数会接收到子进程退出的信号,进而循环再启动子进程,此过程实时性非常高。</p>
<p>
c3. 当kill掉父进程时,子进程会被init进程接管,如果此时再kill掉子进程,则子进程会退出。</p>
<p>
c4. 当同时kill掉父子进程,则父子进程都会退出。</p>
<p>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
原文链接:https://blog.csdn.net/lcy4599/article/details/52267517</p>
頁:
[1]