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