自己在服務器跑一些需要長期運行的程序時,偶爾會因為一些奇怪的原因掛掉,如果要人為去檢查很麻煩,因此最好能夠?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