标签:nta xxx crontab == 解释 sub ext 链接 需要
一、告警系统邮件引擎def sendqqmail(username,password,mailfrom,mailto,subject,content):
gserver = ‘smtp.163.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, mailto, msg.as_string())
smtp.close()
except Exception,err:
print "Send mail failed. Error: %s" % err
def main():
to=sys.argv[1]
subject=sys.argv[2]
content=sys.argv[3]
##定义QQ邮箱的账号和密码,你需要修改成你自己的账号和密码(请不要把真实的用户名和
密码放到网上公开,否则你会死的很惨)
sendqqmail(‘xxx@163.com‘,‘邮箱授权密码‘,‘xxx@163.com‘,to,subject,content)
if name == "main":
main()
//脚本解释:
gserver = ‘smtp.163.com‘定义发邮件服务器的域名
最核心的不是mail.py,而是mail.sh脚本,因为在所有的子脚本中使用到的都是mail.sh
mail.sh主要目的是做告警收敛的,如果服务器监控的机器比较多,邮件一分钟告警次数就几百封,收敛的目的是当服务出现问题,第一次检查发一封告警,告诉你出现问题了,如果第二分钟服务没有,设置不告警,如果第十分钟还是没有恢复,再发一封告警邮件,就是这样的一个目的,关键难点在于计数器怎么搞,如果$v大于3600秒(1小时),直接mail.py $1 $2 $3;当服务异常的时候才会调用mail.sh脚本
[root@linux-01 mail]# vim mail.sh
log=$1
t_s=date +%s
t_s2=date -d "2 hours ago" +%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]
echo $v
if [ $v -gt 3600 ]
then
./mail.py $1 $2 $3
echo "0" > /tmp/$log.txt
else
if [ ! -f /tmp/$log.txt ]
then
echo "0" > /tmp/$log.txt
fi
nu=cat /tmp/$log.txt
nu2=$[$nu+1]
echo $nu2>/tmp/$log.txt
if [ $nu2 -gt 10 ]
then
./mail.py $1 "trouble continue 10 min $2" "$3"
echo "0" > /tmp/$log.txt
fi
fi
//脚本解释:
log=$1其中log作为一个变量,$1是第一个参数,当你发邮件的时候,每次发邮件的时候都要找到一个跟监控项对应的一个日志;
t_s=date +%s
定义了一个时间戳;
t_s2=date -d "2 hours ago" +%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] v又定义了一个变量,上一次的时间戳和这次的时间戳做对比;
echo $v 查看相差几秒,如果每分钟执行一次,那么两个时间戳相差就是60秒;
echo "0" > /tmp/$log.txt这里又生成一个新的日志,这个日志的目的是用来计数的计数器,只要它告警了就记一个数,依次告警记一个数加一,在一个周期之内,比如定义的就是10分钟;如果差值大于3600了,就会直接发邮件
如果差值小于3600,就会做另外一种判断
else
if [ ! -f /tmp/$log.txt ]
then
echo "0" > /tmp/$log.txt //如果文件存在,重置,如果文件不存在,直接创建这个文件
fi
nu=cat /tmp/$log.txt
定义新的变量nu,nu主要是查看计数器里面的数字;
nu2=$[$nu+1] nu2表示在nu的基础上加1;
echo $nu2>/tmp/$log.txt 加完1之后把计数器的数值写入到/tmp/$log.txt 里面去;
if [ $nu2 -gt 10 ] 如果计数器大于10
./mail.py $1 "trouble continue 10 min $2" "$3" 去邮件提示问题持续了10分钟了;
echo "0" > /tmp/$log.txt 告完警之后重新开始计数 ;
思路:分几种情况:
第一种:一台新机器刚加上告警系统监控脚本mail.sh,这个脚本在机器上从来没有执行过
第二种:问题持续了2分钟,第三分钟的时候问题恢复了,但是在第八分钟问题又出现了
核心:1、计时 3600秒 2、计数 10次
二、运行告警系统
要执行告警系统,肯定是每分钟执行一次
下面写一个每分钟执行一次的cron
[root@linux-01 mail]# pwd
/usr/local/sbin/mon/mail
[root@linux-01 mail]# crontab -e //加入任务计划
标签:nta xxx crontab == 解释 sub ext 链接 需要
原文地址:http://blog.51cto.com/13669226/2148783