Linux服务器硬件运行状态及故障邮件提醒的监控脚本分享
监控硬件运行状况
shell监控cpu,memory,loadaverage,记录到log,当负载压力时,发电邮通知管理员。
原理:
1.获取cpu,memory,loadaverage的数值
2.判断数值是否超过自定义的范围,例如(CPU>90%,Memory<10%,loadaverage>2)
3.如数值超过范围,发送电邮通知管理员。发送有时间间隔,每小时只会发送一次。
4.将数值写入log。
5.设置crontab每30秒运行一次。
ServerMonitor.sh
#!/bin/bash
#系统监控,记录cpu、memory、loadaverage,当超过规定数值时发电邮通知管理员
#***configstart***
#当前目录路径
ROOT=$(cd"$(dirname"$0")";pwd)
#当前服务器名
HOST=$(hostname)
#log文件路径
CPU_LOG="${ROOT}/logs/cpu.log"
MEM_LOG="${ROOT}/logs/mem.log"
LOAD_LOG="${ROOT}/logs/load.log"
#通知电邮列表
NOTICE_EMAIL='admin@admin.com'
#cpu,memory,loadaverage记录上一次发送通知电邮时间
CPU_REMARK='/tmp/servermonitor_cpu.remark'
MEM_REMARK='/tmp/servermonitor_mem.remark'
LOAD_REMARK='/tmp/servermonitor_loadaverage.remark'
#发通知电邮间隔时间
REMARK_EXPIRE=3600
NOW=$(date+%s)
#***configend***
#***functionstart***
#获取CPU占用
functionGetCpu(){
cpufree=$(vmstat15|sed-n'3,$p'|awk'{x=x+$15}END{printx/5}'|awk-F.'{print$1}')
cpuused=$((100-$cpufree))
echo$cpuused
localremark
remark=$(GetRemark${CPU_REMARK})
#检查CPU占用是否超过90%
if["$remark"=""]&&["$cpuused"-gt90];then
echo"Subject:${HOST}CPUusesmorethan90%$(date+%Y-%m-%d''%H:%M:%S)"|sendmail${NOTICE_EMAIL}
echo"$(date+%s)">"$CPU_REMARK"
fi
}
#获取内存使用情况
functionGetMem(){
mem=$(free-m|sed-n'3,3p')
used=$(echo$mem|awk-F'''{print$3}')
free=$(echo$mem|awk-F'''{print$4}')
total=$(($used+$free))
limit=$(($total/10))
echo"${total}${used}${free}"
localremark
remark=$(GetRemark${MEM_REMARK})
#检查内存占用是否超过90%
if["$remark"=""]&&["$limit"-gt"$free"];then
echo"Subject:${HOST}Memoryusesmorethan90%$(date+%Y-%m-%d''%H:%M:%S)"|sendmail${NOTICE_EMAIL}
echo"$(date+%s)">"$MEM_REMARK"
fi
}
#获取loadaverage
functionGetLoad(){
load=$(uptime|awk-F'loadaverage:''{print$2}')
m1=$(echo$load|awk-F',''{print$1}')
m5=$(echo$load|awk-F',''{print$2}')
m15=$(echo$load|awk-F',''{print$3}')
echo"${m1}${m5}${m15}"
m1u=$(echo$m1|awk-F'.''{print$1}')
localremark
remark=$(GetRemark${LOAD_REMARK})
#检查是否负载是否有压力
if["$remark"=""]&&["$m1u"-gt"2"];then
echo"Subject:${HOST}LoadAveragemorethan2$(date+%Y-%m-%d''%H:%M:%S)"|sendmail${NOTICE_EMAIL}
echo"$(date+%s)">"$LOAD_REMARK"
fi
}
#获取上一次发送电邮时间
functionGetRemark(){
localremark
if[-f"$1"]&&[-s"$1"];then
remark=$(cat$1)
if[$(($NOW-$remark))-gt"$REMARK_EXPIRE"];then
rm-f$1
remark=""
fi
else
remark=""
fi
echo$remark
}
#***functionend***
cpuinfo=$(GetCpu)
meminfo=$(GetMem)
loadinfo=$(GetLoad)
echo"cpu:${cpuinfo}">>"${CPU_LOG}"
echo"mem:${meminfo}">>"${MEM_LOG}"
echo"load:${loadinfo}">>"${LOAD_LOG}"
exit0
监控网站是否异常
shell监控网站是否异常的脚本,如有异常自动发电邮通知管理员。
流程:
1.检查网站返回的http_code是否等于200,如不是200视为异常。
2.检查网站的访问时间,超过MAXLOADTIME(10秒)视为异常。
3.发送通知电邮后,在/tmp/monitor_load.remark记录发送时间,在一小时内不重复发送,如一小时后则清空/tmp/monitor_load.remark。
#!/bin/bash
SITES=("http://web01.example.com""http://web02.example.com")#要监控的网站
NOTICE_EMAIL='me@example.com'#管理员电邮
MAXLOADTIME=10#访问超时时间设置
REMARKFILE='/tmp/monitor_load.remark'#记录时否发送过通知电邮,如发送过则一小时内不再发送
ISSEND=0#是否有发送电邮
EXPIRE=3600#每次发送电邮的间隔秒数
NOW=$(date+%s)
if[-f"$REMARKFILE"]&&[-s"$REMARKFILE"];then
REMARK=$(cat$REMARKFILE)
#删除过期的电邮发送时间记录文件
if[$(($NOW-$REMARK))-gt"$EXPIRE"];then
rm-f${REMARKFILE}
REMARK=""
fi
else
REMARK=""
fi
#循环判断每个site
forsitein${SITES[*]};do
printf"starttoload${site}\n"
site_load_time=$(curl-o/dev/null-s-w"time_connect:%{time_connect}\ntime_starttransfer:%{time_starttransfer}\ntime_total:%{time_total}""${site}")
site_access=$(curl-o/dev/null-s-w%{http_code}"${site}")
time_total=${site_load_time##*:}
printf"$(date'+%Y-%m-%d%H:%M:%S')\n"
printf"siteloadtime\n${site_load_time}\n"
printf"siteaccess:${site_access}\n\n"
#notsend
if["$REMARK"=""];then
#checkaccess
if["$time_total"="0.000"]||["$site_access"!="200"];then
echo"Subject:${site}canaccess$(date+%Y-%m-%d''%H:%M:%S)"|sendmail${NOTICE_EMAIL}
ISSEND=1
else
#checkloadtime
if["${time_total%%.*}"-ge${MAXLOADTIME}];then
echo"Subject:${site}loadtimetotal:${time_total}$(date+%Y-%m-%d''%H:%M:%S)"|sendmail${NOTICE_EMAIL}
ISSEND=1
fi
fi
fi
done
#发送电邮后记录发送时间
if["$ISSEND"="1"];then
echo"$(date+%s)">$REMARKFILE
fi
exit0