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

 

posted @ 2019-03-06 10:01  侃豺小哥  阅读(1642)  评论(0编辑  收藏  举报