監控某程序工作狀態的指令碼
阿新 • • 發佈:2018-12-03
很多時候,我們需要監控某個指令碼是否正在執行,如果不在執行,則需將它重啟。
思路:
監測指令碼或程序的執行狀態,可以通過ps -ef,再加上grep命令進行定位。
如果該程序在執行,則上述命令會輸出資訊。
如果不輸出資訊,則通過 sh 指令碼名稱 的命令方式進行重啟。
上述動作需要一直執行,故需要通過死迴圈來執行。
測試:
1, 我先建立一個test.sh的指令碼,內容如下,每隔兩秒中輸出一段資訊
#!/bin/bash #測試指令碼 while true do echo '我是測試指令碼'; sleep 2; done
執行:
[email protected]❯~/桌面$ sh test.sh
我是測試指令碼
我是測試指令碼
我是測試指令碼
.
.
.
2, 寫一個監測指令碼testMonitor.sh,內容如下:
#!/bin/bash #監測某指令碼執行情況 $0為當前指令碼的路徑 $1為被監測指令碼的絕對路徑 if [ -z "$1" ] then echo "請輸入需要監測的指令碼絕對路徑" exit 2 else #獲取到該路徑對應的指令碼命令名稱 cmd=$(echo ${1##*/}) fi while true do st=$(ps -ef | grep "$cmd" | grep -v grep | grep -v "$0") if [ -z "$st" ] then echo $1 "指令碼終止,即將重啟。" sh $1 else echo $1 "指令碼正在執行" fi sleep 0.5 done
3, 執行監測指令碼
3.1 不輸入被監測指令碼的路徑,報錯
[email protected]❯~/桌面$ sh shMonitor.sh
請輸入需要監測的指令碼絕對路徑
3.2 輸入被監測指令碼的路徑
[email protected]❯~/桌面$ sh shMonitor.sh ~/桌面/test.sh /home/c80k2/桌面/test.sh 指令碼正在執行 /home/c80k2/桌面/test.sh 指令碼正在執行 /home/c80k2/桌面/test.sh 指令碼正在執行 /home/c80k2/桌面/test.sh 指令碼正在執行 /home/c80k2/桌面/test.sh 指令碼正在執行 /home/c80k2/桌面/test.sh 指令碼正在執行 /home/c80k2/桌面/test.sh 指令碼正在執行 . . .
3.3 我們把test.sh指令碼停掉,再執行監測指令碼,看結果
ps -aux | grep 'test.sh' | grep -v grep | grep -v 'shMonitor.sh'
c80k2 9374 0.0 0.0 4504 1648 pts/30 S+ 21:56 0:00 sh /home/c80k2/桌面/test.sh
kill 9374
/home/c80k2/桌面/test.sh 指令碼終止,即將重啟。
我是測試指令碼
我是測試指令碼
.
.
.
我是測試指令碼
Terminated
/home/c80k2/桌面/test.sh 指令碼終止,即將重啟。
我是測試指令碼
我是測試指令碼
.
.
.
我是測試指令碼
Terminated
/home/c80k2/桌面/test.sh 指令碼終止,即將重啟。
我是測試指令碼
我是測試指令碼
可以看到,每次將test.sh殺掉之後,監控程序就會將它重啟,bingo!