• 技术文章 >后端开发 >php教程

    node.js - 如何将我的php脚本以守护进程的方式一直运行?

    2016-08-23 09:17:51原创920
    我用swoole写了一个服务端,打算将他以守护进程的方式挂在服务器上一直跑,并且能让该脚本在因为出错而意外退出之后能够尽快重启,请问怎么做?

    回复内容:

    我用swoole写了一个服务端,打算将他以守护进程的方式挂在服务器上一直跑,并且能让该脚本在因为出错而意外退出之后能够尽快重启,请问怎么做?

    linux nohup命令运行这个php脚本 然后写个shell监控这个脚本的运行状态 如果脚本死了 就重启

    把脚本写成一直循环就可以了,比如 while(1),这样就可以一直跑了。

    在这个脚本头,这个判断,如果已经有这个脚本的进程了,就直接退出,没有才执行,

    另外写个linix计划任务,比如每分钟去执行这个php脚本。

    执行一次脚本之后,脚本就会一直跑了,计划任务会每分钟去执行这个脚本,如果这个脚本活着,就直接退出,死了就开始执行。

    写好php脚本。建议定期检测内存占用,核心逻辑就不写了。这个跟业务有关。

    if(memory_get_usage()>100*1024*1024){
        exit(0);//大于100M内存退出程序,防止内存泄漏被系统杀死导致任务终端
    }

    假设该php文件的路径为/root/run.php
    打开终端

    setsid php /root/run.php > /dev/null &

    编辑进程监控脚本,当进程不存在时,自动重启 /root/monitor.sh

    #!/bin/bash
    alive=`ps aux|grep root\/run|grep -v grep|wc -l`
    if [ $alive -eq 0]
    then
    php /root/run.php > /dev/null &
    fi

    添加计划任务(每分钟检测一次)

    crontab -e
    * * * * * /root/monitor.sh > /dev/null &

    手工

    用一个简单可靠的Shell脚本来守护一个可能会突发退出的PHP服务

    /etc/rc.local 里加入开机启动命令:

    nohup /path/to/swoole.sh >>/path/to/swoole.sh.log 2>&1 &

    swoole.sh 内容如下:

    #!/bin/sh
    PREFIX=/home/eechen
    INTERVAL=1
    nohup php ${PREFIX}/swoole.php >>${PREFIX}/swoole.log 2>&1 & echo $! > ${PREFIX}/swoole.pid
    while [ 1 ]; do
        if [ ! -d /proc/`cat ${PREFIX}/swoole.pid` ]; then
            nohup php ${PREFIX}/swoole.php >>${PREFIX}/swoole.log 2>&1 & echo $! > ${PREFIX}/swoole.pid
            echo 'NEW_PID:'`cat ${PREFIX}/swoole.pid && date '+%Y-%m-%d %H:%M:%S'`
        fi
        sleep ${INTERVAL}
    done

    其中:

    nohup 表示忽略SIGHUP信号(编号1),比如退出终端时发送的SIGHUP信号(kill -SIGHUP PID)会被忽略掉.
    >>${PREFIX}/swoole.log 表示把标准输出重定向(>>表示追加,>表示覆盖)到文件swoole.log
    2>&1 表示将标准错误(2:stderr)重定向到标准输出(1:stdout).
    结尾加上&表示将命令放入后台运行.
    $! 表示前面运行在后台的PHP进程PID.

    也就是swoole.sh每隔1秒检测一次目录/proc/PID是否存在,如果不存在,则重新启动服务.
    swoole.sh.log 记录的是服务重新启动的时间.
    swoole.log 记录的是服务自己的输出.

    比如用Shell守护vmstat:

    vmstat.sh
    #!/bin/sh
    PREFIX=/home/eechen
    INTERVAL=1
    nohup vmstat 1 >>${PREFIX}/vmstat.log 2>&1 & echo $! > ${PREFIX}/vmstat.pid
    while [ 1 ]; do
        if [ ! -d /proc/`cat ${PREFIX}/vmstat.pid` ]; then
            nohup vmstat 1 >>${PREFIX}/vmstat.log 2>&1 & echo $! > ${PREFIX}/vmstat.pid
            echo 'NEW_PID:'`cat ${PREFIX}/vmstat.pid && date '+%Y-%m-%d %H:%M:%S'`
        fi
        sleep ${INTERVAL}
    done
    
    #运行
    nohup /home/eechen/vmstat.sh >>/home/eechen/vmstat.sh.log 2>&1 &
    #杀死,可以看到vmstat被重启
    kill `cat /home/eechen/vmstat.pid`

    这个vmstat.sh的脚本也可以用PHP实现:

    nohup php /home/eechen/vmstat.php >>/home/eechen/vmstat.php.log 2>&1 &
    >$prefix/vmstat.log 2>&1 & echo $! > $prefix/vmstat.pid");
    while ( 1 ) {
        if ( !file_exists('/proc/'.trim(file_get_contents("$prefix/vmstat.pid"))) ) {
            shell_exec("nohup vmstat 1 >>$prefix/vmstat.log 2>&1 & echo $! > $prefix/vmstat.pid");
            echo 'NEW_PID:'.trim(file_get_contents("$prefix/vmstat.pid")).' '.date('Y-m-d H:i:s');
        }
        sleep($interval);
    }

    1.crontab肯定得有,每分都去检测有没有,(ps -ef | grep..),有退出,没有就建立执行
    2.一直运行的进程,可以死循环..
    3.crontab脚本可以检测你这一直运行进程的状态,出问题,一直等待,没响应还是别的问题,得自己能杀死且重启

    Linux shell执行

    php入门到就业线上直播课:查看学习

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:php node.js centos ubuntu linux
    上一篇:php中有什么函数可以追踪代码加载的顺序,类似于tp中的page_trace这个功能,【debug_backtrace除外】 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 你知道如何用PHP实现多进程吗• PHP与MySQL连接的方法总结• 求解:phpcms模板怎样转码?该怎么解决• php 之 cookie 跟 session 简单解读(笔记)• php 网页截取快讯代码
    1/1

    PHP中文网