首頁  >  文章  >  後端開發  >  node.js - 如何將我的php腳本以守護程式的方式一直運作?

node.js - 如何將我的php腳本以守護程式的方式一直運作?

WBOY
WBOY原創
2016-08-23 09:17:511528瀏覽

我用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執行

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn