Shell告警监控系统

前端之家收集整理的这篇文章主要介绍了Shell告警监控系统前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


main.sh 主控制脚本

#!/bin/bash

#是否发送邮件的开关(维护模式下我们需要关闭功能,监控还是继续,但不发任何邮件。)
exportsend=1
#过滤ip地址(一旦报警,需要需要知道是哪台机器的IP,没有服务端,全部都是独立运行的。监控的网卡可以修改,也可更改为hostname)
exportaddr=`/sbin/ifconfig|grep-A1"ens33:"|awk'/inet/{print$2}'`
dir=`pwd`
#只需要最后一级目录名
last_dir=`echo$dir|awk-F'/''{print$NF}'`
#下面的判断目的是,保证执行脚本的时候,我们在bin目录里,不然监控脚本、邮件和日志很有可能找不到(脚本中涉及的目录几乎都是相对路径。)!!
if[$last_dir=="bin"]||[$last_dir=="bin/"];then
conf_file="../conf/mon.conf"
else
echo"youshoudcdbindir"
exit
fi
exec1>>../log/mon.log2>>../log/err.log
echo"`date+"%F%T"`loadaverage"
/bin/bash../shares/load.sh
#先检查配置文件中是否需要监控502
ifgrep-q'to_mon_502=1'$conf_file;then
exportlog=`grep'logfile='$conf_file|awk-F'=''{print$2}'|sed's///g'`
/bin/bash../shares/502.sh
fi


mon.conf 配置文件

##toconfigtheoptionsiftomonitor
##定义MysqL的服务器地址、端口以及user、password(如下的cdb是我目前的数据库,可选择监控与否)
to_mon_cdb=0##0or1,default0,0notmonitor,1monitor
db_ip=10.20.3.13
db_port=3315
db_user=username
db_pass=passwd
##httpd如果是1则监控,为0不监控
to_mon_httpd=0
##PHP如果是1则监控,为0不监控
to_mon_PHP_socket=0
##http_code_502需要定义访问日志的路径(配合如上主脚本,如果to_mon_502=1就会开启监控报警)
to_mon_502=1
logfile=/data/log/xxx.xxx.com/access.log
##request_count定义日志路径以及域名(监控请求数,如上说明0或者1开关与否)
to_mon_request_count=0
req_log=/data/log/www.xxx.com/access.log
domainname=www.xxx.com


load.sh 告警系统

#!/bin/bash

load=`uptime|awk-F'average:''{print$2}'|cut-d','-f1|sed's///g'|cut-d.-f1`
if[$load-gt10]&&[$send-eq"1"]
then
echo"$addr`date+%T`loadis$load">../log/load.tmp
/bin/bash../mail/mail.shtest@163.com"$addr\_load:$load"`cat../log/load.tmp`
fi
echo"`date+%T`loadis$load"


502.sh 告警系统

#!/bin/bash
d=`date-d"-1min"+%H:%M`
c_502=`grep:$d:$log|grep'502'|wc-l`
if[$c_502-gt10]&&[$send==1];then
echo"$addr$d502countis$c_502">../log/502.tmp
/bin/bash../mail/mail.sh$addr\_502$c_502../log/502.tmp
fi
echo"`date+%T`502$c_502"


disk.sh 告警系统

#!/bin/bash

rm-f../log/disk.tmp
##用空格或者%为分隔符,筛选出来磁盘使用量的百分比。
forrin`df-h|awk-F'[%]+''{print$5}'|grep-vUse`
do
if[$r-gt90]&&[$send-eq"1"]
then
echo"$addr`date+%T`diskuseageis$r">>../log/disk.tmp
fi
done
if[-f../log/disk.tmp]
then
df-h>>../log/disk.tmp
/bin/bash../mail/mail.sh$addr\_disk$r../log/disk.tmp
echo"`date+%T`diskuseageisnook"
else
echo"`date+%T`diskuseageisok"
fi


mail.sh 告警收敛

log=$1//log作为一个变量,接收来自第一个参数的值
t_s=`date+%s`//时间戳
t_s2=`date-d"2hoursago"+%s`//两个小时前的时间戳
if[!-f/tmp/$log]//如果日志文件不存在
then
echo$t_s2>/tmp/$log//把两个小时前的时间戳写到日志
fi
t_s2=`tail-1/tmp/$log|awk'{print$1}'`//截取时间戳
echo$t_s>>/tmp/$log//追加当前时间戳
v=$[$t_s-$t_s2]//时间戳的时间差(以秒为单位)详情如下1
echo$v
if[$v-gt3600]//在此也就是,当过了1小时如果还是没有恢复再次发告警邮件调用mail.py(如果没有恢复,每1小时发一次)
then
./mail.py$1$2$3
echo"0">/tmp/$log.txt//生成一个新的.txt日志。用来记录告警
else
if[!-f/tmp/$log.txt]//判断有没有这个日志文件
then
echo"0">/tmp/$log.txt//计数器
fi
nu=`cat/tmp/$log.txt`//查看计数器
nu2=$[$nu+1]//计数器+1
echo$nu2>/tmp/$log.txt//把计数器写入日志文件
if[$nu2-gt10]
then
./mail.py$1"troublecontinue10min$2""$3"//代表着已经持续了10分钟了
echo"0">/tmp/$log.txt//重新开始计数
fi
fi


mail.py 发邮件脚本

#####脚本使用说明######
#1.首先定义好脚本中的邮箱账号和密码
#2.脚本执行命令为:pythonmail.py目标邮箱"邮件主题""邮件内容"
#!/usr/bin/envpython
#-*-coding:UTF-8-*-
importos,sys
reload(sys)
sys.setdefaultencoding('utf8')
importgetopt
importsmtplib
fromemail.MIMETextimportMIMEText
fromemail.MIMEMultipartimportMIMEMultipart
fromsubprocessimport*
defsendqqmail(username,password,mailfrom,mailto,subject,content):
gserver='smtp.qq.com'
gport=25
try:
msg=MIMEText(unicode(content).encode('utf-8'))
msg['from']=mailfrom
msg['to']=mailto
msg['Reply-To']=mailfrom
msg['Subject']=subject
smtp=smtplib.SMTP(gserver,gport)
smtp.set_debuglevel(0)
smtp.ehlo()
smtp.login(username,password)
smtp.sendmail(mailfrom,msg.as_string())
smtp.close()
exceptException,err:
print"SendmailFailed.Error:%s"%err
defmain():
to=sys.argv[1]
subject=sys.argv[2]
content=sys.argv[3]
sendqqmail('1234567@qq.com','aaaaaaaaaa','1234567@qq.com',to,content)//定义QQ邮箱的账号和密码
if__name__=="__main__":
main()


crontab 每分钟执行一次

*/1****cd/usr/local/sbin/mon/bin;bashmain.sh

猜你在找的Bash相关文章