我用swoole寫了一個服務端,打算將他以守護進程的方式掛在伺服器上一直跑,並且能讓該腳本在因為出錯而意外退出之後能夠盡快重啟,請問怎麼做?
我用swoole寫了一個服務端,打算將他以守護進程的方式掛在伺服器上一直跑,並且能讓該腳本在因為出錯而意外退出之後能夠盡快重啟,請問怎麼做?
linux nohup指令執行這個php腳本 然後寫個shell監控這個腳本的運作狀態 如果腳本死了 就重啟
把腳本寫成一直循環就可以了,像是 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/bash alive=`ps aux|grep root\/run|grep -v grep|wc -l` if [ $alive -eq 0] then php /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/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</code>
其中:
<code>nohup 表示忽略SIGHUP信号(编号1),比如退出终端时发送的SIGHUP信号(kill -SIGHUP PID)会被忽略掉. >>${PREFIX}/swoole.log 表示把标准输出重定向(>>表示追加,>表示覆盖)到文件swoole.log 2>&1 表示将标准错误(2:stderr)重定向到标准输出(1:stdout). 结尾加上&表示将命令放入后台运行. $! 表示前面运行在后台的PHP进程PID.</code>
也就是swoole.sh每隔1秒檢測一次目錄/proc/PID是否存在,如果不存在,則重新啟動服務.
swoole.sh.log 記錄的是服務重新啟動的時間.
swoole.log 記錄的是服務自己的輸出.
例如用Shell守護vmstat:
<code>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`</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執行