• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-23) 34次浏览 已收录 0个评论
文章目录[隐藏]

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

回复内容:

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

linux nohup命令运行这个php脚本 然后写个shell监控这个脚本的运行状态 如果脚本&文来源gao@daima#com搞(%代@#码网@本死了 就重启

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

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

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

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

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

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

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

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

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

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

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

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

手工

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

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

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

swoole.sh 内容如下:

<code>#!/bin/shPREFIX=/home/eechenINTERVAL=1nohup php ${PREFIX}/swoole.php >>${PREFIX}/swoole.log 2>&1 & echo $! > ${PREFIX}/swoole.pidwhile [ 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</code>

其中:

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

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

比如用Shell守护vmstat:

<code>vmstat.sh#!/bin/shPREFIX=/home/eechenINTERVAL=1nohup vmstat 1 >>${PREFIX}/vmstat.log 2>&1 & echo $! > ${PREFIX}/vmstat.pidwhile [ 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`</code>

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

<code>nohup php /home/eechen/vmstat.php >>/home/eechen/vmstat.php.log 2>&1 &<?php$prefix = '/home/eechen';$interval = 1;shell_exec("nohup vmstat 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);}</code>

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

Linux shell执行


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:node.js – 如何将我的php脚本以守护进程的方式一直运行?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址