如何將我的php腳本以守護(hù)進(jìn)程的方式一直運(yùn)行

1.寫好php腳本。建議定期檢測內(nèi)存占用,核心邏輯就不寫了。這個(gè)跟業(yè)務(wù)有關(guān)。

if(memory_get_usage()>100*1024*1024){
    exit(0);//大于100M內(nèi)存退出程序,防止內(nèi)存泄漏被系統(tǒng)殺死導(dǎo)致任務(wù)終端
}

假設(shè)該php文件的路徑為/root/run.php
打開終端

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

編輯進(jìn)程監(jiān)控腳本,當(dāng)進(jìn)程不存在時(shí),自動(dòng)重啟 /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
添加計(jì)劃任務(wù)(每分鐘檢測一次)
crontab -e
* * * * * /root/monitor.sh > /dev/null &

2.用一個(gè)簡單可靠的Shell腳本來守護(hù)一個(gè)可能會(huì)突發(fā)退出的PHP服務(wù)

/etc/rc.local 里加入開機(jī)啟動(dòng)命令:

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

swoole.sh 內(nèi)容如下:

#!/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),比如退出終端時(shí)發(fā)送的SIGHUP信號(kill -SIGHUP PID)會(huì)被忽略掉.

{PREFIX}/swoole.log 表示把標(biāo)準(zhǔn)輸出重定向(>>表示追加,>表示覆蓋)到文件swoole.log 2>&1 表示將標(biāo)準(zhǔn)錯(cuò)誤(2:stderr)重定向到標(biāo)準(zhǔn)輸出(1:stdout). 結(jié)尾加上&表示將命令放入后臺運(yùn)行.! 表示前面運(yùn)行在后臺的PHP進(jìn)程PID.
也就是swoole.sh每隔1秒檢測一次目錄/proc/PID是否存在,如果不存在,則重新啟動(dòng)服務(wù).
swoole.sh.log 記錄的是服務(wù)重新啟動(dòng)的時(shí)間.
swoole.log 記錄的是服務(wù)自己的輸出.

比如用Shell守護(hù)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

運(yùn)行

nohup /home/eechen/vmstat.sh >>/home/eechen/vmstat.sh.log 2>&1 &

殺死,可以看到vmstat被重啟

kill cat /home/eechen/vmstat.pid
這個(gè)vmstat.sh的腳本也可以用PHP實(shí)現(xiàn):

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
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容