监控机器负载
背景说明
明天就是周末,你却发现程序有bug!!!在某些情况下会进入极度消耗资源的暴走模式,时间在一分一秒的过去,可就是找不着原因。幸运的是,你发现只要一重启问题便消失了,只是不定什么时候又出现,所以机警如你立刻想到,不如用个定时脚本来监控处理重启吧。
问题分析
首先,通过“uptime”命令可以得到近一段时间的机器负载情况;
然后,为了防止误伤,通过ps命令获取目标程序的cpu使用率;
作为保险,还可以再添加多一个接口超时的判断
最后,当机器5分钟负载以及目标程序cpu占用都超过阈值的时候,重启~~
解决方案
#! /bin/sh # 确定警告阈值 MAX_LOAD=1 MAX_CPU=450 # 获取最近5分钟的机器负载情况 LOAD=`uptime | awk -F 'load average: ' '{print $2}'|awk '{print $2}'` echo "load 5min: ${LOAD}" # 首先获取程序PID,然后通过PID获取进程CPU占用率 PROGRAM_PID=`ps -elf|grep "FuckProgram"|grep -v "grep"|awk '{print $4}'` echo "program pid: ${PROGRAM_PID}" PROGRAM_CPU=`ps -p ${PROGRAM_PID} -o pcpu |grep -v CPU |awk '{print $1}'` echo "program cpu: ${PROGRAM_CPU}" # 比较警告阈值与当前值 resultLoad=`awk -v num1=${LOAD} -v num2=${MAX_LOAD} 'BEGIN{print(num1>num2)?"1":"0"}'` resultCPU=`awk -v num1=${PROGRAM_CPU} -v num2=${MAX_CPU} 'BEGIN{print(num1>num2)?"1":"0"}'` # 作为双保险的接口超时判断 MAX_CONNECT_SEC=5 MAX_TRANS_SEC=10 URL="http://some_fuck_url" RESP=`curl --connect-timeout ${MAX_CONNECT_SEC} -m ${MAX_TRANS_SEC} "${URL}"` result=$(echo ${RESP} | grep "some fuck content") resultCURL=1 if [ -n "${result}" ];then resultCURL=0 fi if [ $resultLoad -eq 1 ] ; then if [ $resultCPU -eq 1 ] ; then if [ $resultCURL -eq 1 ] ; then echo `date`" restart" restart.sh fi fi fi
把以上脚本保存至单独文件,然后添加到crontab每分钟执行,便可以开心的下班过周末了。