2014年11月23日 14:48:42

Shell+Crontab实现服务进程监控重启

作者: 
本文提供一个shell脚本,结合crontab的使用可以实现对服务器服务进程的运行情况进行监控,及时重启服务器关键服务进程,避免关键服务进程长期终止情况发生。
文中的shell脚本参考自《shell脚本监测进程并实现自动启动》,加入了注释说明并对扩展性做了简单调整,实现脚本多次调用。

shell脚本

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



未经同意禁止转载!
转载请附带本文原文地址:Shell+Crontab实现服务进程监控重启,首发自 Zjmainstay学习笔记
阅读( 10973 )
看完顺手点个赞呗:
(5 votes)

1.PHP cURL群:PHP cURL高级技术
2.正则表达式群:专精正则表达式
3. QQ联系(加请说明):QQ联系博主(951086941)
4. 邮箱:zjmainstay@163.com
5. 打赏博主:

网站总访问量: