美文网首页
如何将我的php脚本以守护进程的方式一直运行

如何将我的php脚本以守护进程的方式一直运行

作者: 金星show | 来源:发表于2019-01-14 12:27 被阅读0次

1.写好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 &

2.用一个简单可靠的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 &
<?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);
}


作者:追梦人的博客
来源:CSDN
原文:https://blog.csdn.net/qq_35396905/article/details/80856192
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章

  • 如何将我的php脚本以守护进程的方式一直运行

    1.写好php脚本。建议定期检测内存占用,核心逻辑就不写了。这个跟业务有关。 假设该php文件的路径为/root/...

  • 4.5、守护进程及信号处理实战

    1、守护进程功能的实现守护进程融入项目,解放终端。相关配置:Daemon = 1;按照守护进程的方式运行守护进程如...

  • PHP创建守护进程

    PHP 创建守护进程 执行守护进程

  • redis.conf详解之daemonize

    用法 作为非守护进程运行 作为守护进程运行 注意事项: 默认情况下,Redis不作为守护进程运行。如果以守护进程运...

  • Redis 配置选项

    daemonize 说明Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 配置...

  • 守护进程

    守护进程是一种后台运行并且独立于所有终端控制之外的进程。 守护进程的启动 要启动一个守护进程,可以采取一下几种方式...

  • laravel monolog log的sql文件权限为root

    解决办法:守护进程以root运行了 php artisan queue:work 以上语句以www运行就可以 解析...

  • laravel 守护进程的实现

    在如何使laravel队列持续运行? 的方式终端关闭后认为就会结束运行在laravel中数据实现守护进程的集中方法...

  • windows下redis的配置文件(redis.windows

    #redis的配置 #Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 dae...

  • Redis配置详解

    redis.cnf Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程daemo...

网友评论

      本文标题:如何将我的php脚本以守护进程的方式一直运行

      本文链接:https://www.haomeiwen.com/subject/jzuddqtx.html