shell+crontab 實時服務進程監控重啟


#!/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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM