理性者 發表於 2023-11-15 00:00:00

PHP程序员玩转Linux系列 使用supervisor实现守护进程

<p>
        PHP程序员玩转Linux系列文章:</p>
<p>
        1.PHP程序员玩转Linux系列-怎么安装使用CentOS</p>
<p>
        2.PHP程序员玩转Linux系列-lnmp环境的搭建</p>
<p>
        3.PHP程序员玩转Linux系列-搭建FTP代码开发环境</p>
<p>
        4.PHP程序员玩转Linux系列-备份还原MySQL</p>
<p>
        5.PHP程序员玩转Linux系列-自动备份与SVN</p>
<p>
        6.PHP程序员玩转Linux系列-Linux和Windows安装nginx</p>
<p>
        7.PHP程序员玩转Linux系列-nginx初学者引导</p>
<p>
        8.PHP程序员玩转Linux系列-Nginx中的HTTPS</p>
<p>
        首先遇到的问题是,部署nodejs的博客程序时,我把执行nodejs的命令放到后台,使用加&amp;和nohup命令</p>
<p>
        如:<span>nodejs index.js &amp; <span>或者</span> nohup nodejs index.js &amp;</span></p>
<p>
        &amp;这个使用是当退出此次终端会话的时候就会停止, nohup这个命令理论上是可以后台一直执行的,但是当出现某些异常的时候,还是会退出.</p>
<p>
        <strong>进程的基础概念</strong></p>
<p>
        进程是执行程序的过程.unix系统的老祖宗内核进程的ppid都是是0,比如:init进程的pid是1,ppid是0;其他进程都是从init进程的基础上fork出来的,使用<span><strong>pstree</strong></span>命令可以看到进程树</p>
<p>
        <img title="PHP程序员玩转Linux系列 使用supervisor实现守护进程" alt="PHP程序员玩转Linux系列 使用supervisor实现守护进程" src="https://zhuji.jb51.net/uploads/img/202305/14302e065a8930124bc041f14945a69a.jpg"></p>
<p>
        测试使用&amp;实现一个后台进程,并把后台进程再转回到前台,下面是把进程放到后台,这个是job的号</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_688939">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">ping</code> <code class="bash plain">baidu.com &gt; xx.txt &amp;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <img title="PHP程序员玩转Linux系列 使用supervisor实现守护进程" alt="PHP程序员玩转Linux系列 使用supervisor实现守护进程" src="https://zhuji.jb51.net/uploads/img/202305/7c6326090ddbd90d39cfb4588dc5cdcf.jpg"></p>
<p>
        把后台进程重新转到前台,%1的那个数字就是上面的job号</p>
<p>
        <span>fg %1</span></p>
<p>
        <strong>如何使用nohup这个命令 </strong></p>
<p>
        nohup命令,这个命令是使进程忽略SIGHUP挂起(hangup)信号,测试如下:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_134972">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">nohup</code> <code class="bash functions">ping</code> <code class="bash plain">baidu.com &gt; xx.txt &amp;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        进程信号如下:</p>
<p>
        01 SIGHUP 挂起(hangup)<br>
        02 SIGINT 中断,当用户从键盘按^c键或^break键时<br>
        03 SIGQUIT 退出,当用户从键盘按quit键时<br>
        04 SIGILL 非法指令<br>
        05 SIGTRAP 跟踪陷阱(trace trap),启动进程,跟踪代码的执行<br>
        06 SIGIOT IOT指令<br>
        07 SIGEMT EMT指令<br>
        08 SIGFPE 浮点运算溢出<br>
        09 SIGKILL 杀死、终止进程<br>
        10 SIGBUS 总线错误<br>
        11 SIGSEGV 段违例(segmentation  violation),进程试图去访问其虚地址空间以外的位置<br>
        12 SIGSYS 系统调用中参数错,如系统调用号非法<br>
        13 SIGPIPE 向某个非读管道中写入数据<br>
        14 SIGALRM 闹钟。当某进程希望在某时间后接收信号时发此信号<br>
        15 SIGTERM 软件终止(software  termination)<br>
        16 SIGUSR1 用户自定义信号1<br>
        17 SIGUSR2 用户自定义信号2<br>
        18 SIGCLD 某个子进程死<br>
        19 SIGPWR 电源故障 </p>
<p>
        <strong> 使用supervisor实现守护进程</strong></p>
<p>
        守护进程,就是一直运行的收存周期很长的进程.使用supervisor可以实现这样的进程,该进程并且会在被杀掉的时候自动再次重启.</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_652402">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash comments">#安装supervisor</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">yum </code><code class="bash functions">install</code> <code class="bash plain">supervisor</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        在配置文件(/etc/supervisord.conf)配置一下:</p>
<p>
        program:nodejsblog 这里:后面的是个名字,可以随便起<br>
        command= 这里是要执行的命令<br>
        user= 这里是执行用户</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_565775">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain"></code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash functions">command</code><code class="bash plain">=</code><code class="bash plain">/usr/bin/nodejs</code> <code class="bash plain">/var/www/html/nblog</code> <code class="bash plain">index.js</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">user=root</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        开启<span> supervisord -c /etc/supervisord.conf  </span></p>
<p>
        此时nodejs的守护进程也会随着启动了可以使用ps命令去查看一下,并且在你kill该进程的时候,会自动重启.</p>
<p>
        例如我这个例子中测试部署的nodejs网站http://nblog.qingguow.cn</p>
<p>
        与此相关的博文:</p>
<p>
        nodejs开发个人博客(七)后台登陆</p>
<p>
        nodejs开发个人博客(六)数据分页</p>
<p>
        nodejs开发个人博客(五)分配数据</p>
<p>
        nodejs开发个人博客(四)数据模型</p>
<p>
        nodejs开发个人博客(三)载入页面</p>
<p>
        nodejs开发个人博客(二)入口文件</p>
<p>
        nodejs开发个人博客(一)准备工作</p>
<p>
        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
        原文链接:http://www.cnblogs.com/taoshihan/p/6693762.html</p>
頁: [1]
查看完整版本: PHP程序员玩转Linux系列 使用supervisor实现守护进程