shell腳本監(jiān)控&自動拉起程序

自己在服務器跑一些需要長期運行的程序時,偶爾會因為一些奇怪的原因掛掉,如果要人為去檢查很麻煩,因此最好能夠?qū)崿F(xiàn)自動的檢測和掛掉拉起。

有一個好的工具是supervisor,這是一套基于python的進程監(jiān)控工具,能夠進行簡單的配置就達到我們的需求,為你監(jiān)測你的進程并自動拉起掛掉的程序。

但如果你和我一樣使用沒有root權(quán)限的服務器,安裝工具都是一件麻煩事,那也可以自己動手寫一套shell腳本來監(jiān)測和自動拉起,并不難。

以下就是我們的shell監(jiān)測腳本monitor.sh

#!/bin/bash

now=`date '+%Y-%m-%d %H:%M:%S'` # 定義log的時間格式
grepFlag='myWorkingProcess.js' # 你要監(jiān)測的程序名
thisLog='./watchlog' # 該腳本的log日志文件

baseDir="."
sleepTime=60s # 監(jiān)測間隔

# 檢查是否有我們的拉起腳本run.sh
if [ ! -f "$baseDir/run.sh" ]; then
    echo "$baseDir/run.sh missing, check again" >> "$thisLog"
    exit
fi

# 無限循環(huán)(0<1)
while [ 0 -lt 1 ] 
do
    now=`date '+%Y-%m-%d %H:%M:%S'`
    ret=`ps aux | grep "$grepFlag" | grep -v grep | wc -l`
    if [ $ret -eq 0 ]; then # 如果ps找不到運行的目標進程就拉起
        echo "$now process not exists ,restart process now... " >> "$thisLog"
        ./run.sh
        echo "$now restart done ..... "  >> "$thisLog"
    else
        echo "$now process exists , sleep $sleepTime seconds " >> "$thisLog"
    fi
    sleep $sleepTime
done

基本代碼中都注釋了,首先通過 -f 判斷我們的拉起腳本run.sh是否存在。
然后通過一個無限循環(huán)(0小于1則循環(huán))來用ps grep做目標進程的檢查,如果不存在(ret返回0),那就拉起,如果存在,就只打log。然后sleep一段間隔時間。
這個sleep很自由,支持的時間單位有秒、分、時,默認的單位是秒。所以可以:

sleep 1    # 睡眠1秒
sleep 1s   # 睡眠1秒
sleep 1m   # 睡眠1分
sleep 1h   # 睡眠1小時

自行根據(jù)業(yè)務場景選擇間隔時間。
注意這里的baseDir變量,我是將帶監(jiān)控的程序、檢測腳本、拉起腳本都放在同一個目錄下了,所以一個 . 足矣,具體要根據(jù)自己的目錄結(jié)構(gòu)來修改。

代碼中可以看到我們把echo的log輸出都放到指定的日志文件中去了,這里我們用的是>>,如果用>,那么每次打log都會覆蓋全文,從頭開始寫,如果用>>,就是在文件末尾接著寫,看具體需要,如果間隔太短,建議覆蓋。

然后我們寫拉起腳本run.sh

nohup node myWorkingProcess.js > log_myWorkingProcess.log 2>&1 &

拉起腳本很簡單,就是你平常啟動程序時的語句,這里我用了nohup+&來后臺運行程序,并制定程序的輸出日志文件,指定log輸出到myWorkingProcess.log,2>&1將標準出錯重定向到標準輸出,也就是不管是錯誤日志還是常規(guī)日志都輸出到同一個文件。

此時就可以運行monitor腳本來開始監(jiān)控了。

nohup sh ./monitor.sh &

這里我同樣使用nohup+&,&是為了讓腳本在后臺運行,不影響我在終端做其他命令操作,nohup是為了保證我關閉終端后腳本依然運行,不然就會在我關閉終端時腳本也退出。

如果此時出現(xiàn)了“$'\r':command not found”錯誤,那是因為腳本再win下編寫,win的每行結(jié)尾是\r\n,而Unix 行尾標志是\n,就會認為這里的\r是個字符,但是又不認識,因此報錯。這時用dos2unix工具處理一下即可:

dos2unix monitor.sh
dos2unix run.sh

再運行就不會報錯了。

此時可以去日志文件看看,已經(jīng)有日志了。也可以手動kill掉監(jiān)測的進程,看看是否會自動拉起。


查看作者首頁

References:
https://www.chenyudong.com/archives/bash-shell-watch-dog-auto-restart-process.html
https://blog.csdn.net/xiaojun111111/article/details/82752599
https://blog.csdn.net/xiaojun111111/article/details/82752599

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

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

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