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原文链接:https://www.f2er.com/bash/388894.html