84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
我用swoole写了一个服务端,打算将他以守护进程的方式挂在服务器上一直跑,并且能让该脚本在因为出错而意外退出之后能够尽快重启,请问怎么做?
闭关修行中......
用一个简单可靠的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); }
linux nohup命令运行这个php脚本 然后写个shell监控这个脚本的运行状态 如果脚本死了 就重启
写好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 &
手工
把脚本写成一直循环就可以了,比如 while(1),这样就可以一直跑了。
在这个脚本头,这个判断,如果已经有这个脚本的进程了,就直接退出,没有才执行,
另外写个linix计划任务,比如每分钟去执行这个php脚本。
执行一次脚本之后,脚本就会一直跑了,计划任务会每分钟去执行这个脚本,如果这个脚本活着,就直接退出,死了就开始执行。
这种情况直接用supervisor,方便的守护进程管理,还带web管理界面以及日志
1.crontab肯定得有,每分都去检测有没有,(ps -ef | grep..),有退出,没有就建立执行2.一直运行的进程,可以死循环..3.crontab脚本可以检测你这一直运行进程的状态,出问题,一直等待,没响应还是别的问题,得自己能杀死且重启
用php, cli模式跑的话, 应该算是守护进程了吧
swoole本身就有守护进程这个选项详细看swoole官方的wiki,要是守护进程异常退出可以用shell脚本定时去维护这个官网的wiki也给出一个比较好的解决方案。
Linux shell执行
用一个简单可靠的Shell脚本来守护一个可能会突发退出的PHP服务
/etc/rc.local 里加入开机启动命令:
swoole.sh 内容如下:
其中:
也就是swoole.sh每隔1秒检测一次目录/proc/PID是否存在,如果不存在,则重新启动服务.
swoole.sh.log 记录的是服务重新启动的时间.
swoole.log 记录的是服务自己的输出.
比如用Shell守护vmstat:
这个vmstat.sh的脚本也可以用PHP实现:
linux nohup命令运行这个php脚本 然后写个shell监控这个脚本的运行状态 如果脚本死了 就重启
写好php脚本。建议定期检测内存占用,核心逻辑就不写了。这个跟业务有关。
假设该php文件的路径为/root/run.php
打开终端
编辑进程监控脚本,当进程不存在时,自动重启/root/monitor.sh
添加计划任务(每分钟检测一次)
手工
把脚本写成一直循环就可以了,比如 while(1),这样就可以一直跑了。
在这个脚本头,这个判断,如果已经有这个脚本的进程了,就直接退出,没有才执行,
另外写个linix计划任务,比如每分钟去执行这个php脚本。
执行一次脚本之后,脚本就会一直跑了,计划任务会每分钟去执行这个脚本,如果这个脚本活着,就直接退出,死了就开始执行。
这种情况直接用supervisor,方便的守护进程管理,还带web管理界面以及日志
1.crontab肯定得有,每分都去检测有没有,(ps -ef | grep..),有退出,没有就建立执行
2.一直运行的进程,可以死循环..
3.crontab脚本可以检测你这一直运行进程的状态,出问题,一直等待,没响应还是别的问题,得自己能杀死且重启
用php, cli模式跑的话, 应该算是守护进程了吧
swoole本身就有守护进程这个选项详细看swoole官方的wiki,要是守护进程异常退出可以用shell脚本定时去维护这个官网的wiki也给出一个比较好的解决方案。
Linux shell执行