#!/bin/sh #filename: checkProcess.sh #示例:每分鍾檢測httpd是否在運行,不在運行則重啟 #crontab -e # 加入:*/1 * * * * checkProcess.sh "httpd" "/etc/init.d/httpd start" #------------------------------- # 函數: checkProcess # 功能: 檢查一個進程是否存在 # 參數: $1 --- 要檢查的進程名稱(可以加入路徑,增強唯一性) # 返回: 如果存在返回1, 否則返回0. #------------------------------- checkProcess() { # 檢查輸入的參數是否有效 if [ "$1" = "" ] then return 0 fi #$PROCESS_NUM獲取指定進程名的數目(過濾文件名 checkProcess.sh) #【此處做了修訂,加入grep -v "checkProcess.sh",對應修改IS_RUNNING_NUM=3 為 IS_RUNNING_NUM=1】 PROCESS_NUM=`ps -ef | grep "$1" | grep -v "grep" | grep -v "checkProcess.sh" | wc -l` #判斷進程正在運行的數量 IS_RUNNING_NUM=1 echo "Current Process num:$PROCESS_NUM" #實際進程數PROCESS_NUM小於判斷為運行中的數IS_RUNNING_NUM,表示有錯誤,需要重新啟動 if [ $PROCESS_NUM -lt $IS_RUNNING_NUM ]; then return 0 else return 1 fi } #如果參數1或者參數2為空,提示用法 if [ -z "$1" -o -z "$2" ] then echo "Usage: checkProcess.sh process execCommand" echo 'Example: checkProcess.sh "httpd" "/etc/init.d/httpd start"' exit fi # 檢查test實例是否已經存在 # checkProcess.sh "httpd" "/etc/init.d/httpd start" checkProcess $1 checkResult=$? if [ $checkResult -eq 0 ]; then # 殺死所有test進程,可換任意你需要執行的操作 killall -9 $1 echo "Now execute: $2" # 在后台執行程序 exec $2 & else echo "Process is running" fi crontab示例 #啟動apache服務 */1 * * * * /root/shell/checkProcess.sh "/usr/sbin/httpd" "/root/shell/httpdstart.sh" #啟動mysql服務 */1 * * * * /root/shell/checkProcess.sh "/usr/sbin/mysqld" "/root/shell/mysqldstart.sh" 這里為了方便(有些服務的啟動命令比較長),把啟動代碼封裝進了shell腳本中,讀者可以直接寫啟動命令 httpdstart.sh腳本如下: #!/bin/bash /usr/sbin/httpd -k start