Shell程式設計---監控檢查程序是否存活
阿新 • • 發佈:2018-11-13
題目要求:使用shell指令碼監控檢查程序是否存活
分析:
對於非守護程序我們一般都會想到直接去判斷 “ps -ef |egrep xx |egrep -v egrep” 是否有內容;
對於daemon守護程序,通常都會有自己的pid或者lock檔案,然後可以通過檢查這些檔案是否存在來判斷程序是否存活。然而有些異常情況下,pid檔案存在程序卻並不存在。因此並不能依賴程序的pid檔案來檢測程序是否存活。有以下幾種方法:
第一種:
執行 “kill -0 程序號” 命令。 再執行echo $?
原理:kill -0不會向程序傳送任何訊號,但是會進行錯誤檢查。
如果返回值為0,說明程序存活;反之,則此程序有存在問題。
第二種:
執行命令"ps -p 程序號", 再執行echo $? 。
原理:根據給定的pid程序號進行錯誤檢查。
如果有這個程序且正常執行,返回值為0;如果沒有這個程序或異常,返回值為1。
第三種:
執行命令"pgrep 程序名", 再執行echo $? 。
原理:根據給定的程序名進行錯誤檢查。
如果有這個程序且正常執行,返回值為0;如果沒有這個程序或異常,返回值為1。
第四種:
直接判斷/proc/程序號/ 這個目錄是否存在。
原理:linux核心會通過/proc虛擬檔案系統匯出系統中正在執行的程序資訊,每個程序都有一個/proc/程序號/目錄。
注意:
- 使用以上幾種方法監控程序是否存活要麼需要pid程序號要麼需要程序名。因為程序pid是程序的唯一標識,通過pid程序往往比程序名的方法準確。
- 還需要考慮使用者許可權問題,原因在於:
- 在執行 "kill -0 程序號"命令時,普通使用者只能用於檢查自己的程序,因為向其它使用者的程序傳送訊號會因為沒有許可權而出錯,返回值也是1。當然,如果你用特權使用者執行 "kill -0 程序號"命令的話,就沒有許可權問題啦。
- 有時候在同一伺服器上可能會有不同使用者執行多個相同程序名的程序,root使用者還可以獲取所有普通使用者下的程序,而普通使用者只能獲取自己的程序。
解答:
方法1:
#!/bin/sh source /etc/profile #define variable psUser=$1 psProcess=$2 pid= `ps -ef | egrep ${psProcess} | egrep ${psUser} | egrep -v "grep|vi|tail" | sed -n 1p | awk '{print $1}'` echo ${pid} if [ -z ${pid} ];then echo "The process does not exist." exit 1 fi # pgrep ${psProcess} # kill -0 ${pid} ps -p ${pid} result=echo $? if [ ${result} -ne 0 ];then echo "The process is not ok." else echo "The process is ok." fi
方法2:
#!/bin/sh
source /etc/profile
#define variable
psUser=$1
psProcess=$2
pid= `ps -ef | egrep ${psProcess} | egrep ${psUser} | egrep -v "grep|vi|tail" | sed -n 1p | awk '{print $1}'`
echo ${pid}
if [ -z ${pid} ];then
echo "The process does not exist."
exit 1
fi
if [ -d /proc/${pid} ];then
echo "The process is not ok."
else
echo "The process is ok."
fi