博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单告警系统之邮件引擎
阅读量:5840 次
发布时间:2019-06-18

本文共 3407 字,大约阅读时间需要 11 分钟。

hot3.png

本文索引

  • 告警系统邮件引擎
  • 运行告警系统

本文是博文的剩余部分

告警系统邮件引擎

这里使用mail.py进行邮件发送,mail.py是从网上找到的一个发送邮件的Python脚本。

#!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfrom email.MIMEText import MIMETextfrom email.MIMEMultipart import MIMEMultipartfrom  subprocess import *def sendqqmail(username,password,mailfrom,mailto,subject,content):    gserver = 'smtp.163.com' //qq邮箱写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, mailto, msg.as_string())        smtp.close()    except Exception,err:        print "Send mail failed. Error: %s" % errdef main():    to=sys.argv[1]    subject=sys.argv[2]    content=sys.argv[3]##定义QQ邮箱的账号和密码,你需要修改成你自己的账号和密码(请不要把真实的用户名和密码放到网上公开,否则你会死的很惨)    sendqqmail('1234567@qq.com','aaaaaaaaaa','1234567@qq.com',to,subject,content)if __name__ == "__main__":    main()

真正的mail脚本:mail.sh

#!/bin/bash# 用来告警收敛,使得不要频繁告警# 这里主要实现了一个计时器功能log=$1t_s=`date +%s`   //定义一个时间戳t_s2=`date -d "2 hours ago" +%s`  //定义一个2小时前的时间戳if [ ! -f /tmp/$log ]   // 判断日志是否存在,就创建;日志用来记录时间戳then    echo $t_s2 > /tmp/$logfit_s2=`tail -1 /tmp/$log | awk '{print $1}'`  // 获取日志最后一行上的时间戳echo $t_s>>/tmp/$log // 写入当前时间戳v=$[$t_s-$t_s2]  // 2个时间戳时间间隔echo $v// 判断时间间隔是否大于1小时,符号就告警// 这个判断是对新主机执行脚本时的判断if [ $v -gt 3600 ]  then    ./mail.py  $1  $2  $3    echo "0" > /tmp/$log.txtelse    if [ ! -f /tmp/$log.txt ]    then        echo "0" > /tmp/$log.txt  // 记录告警次数,0清空数值,开始一个新的计数周期    fi        nu=`cat /tmp/$log.txt`    nu2=$[$nu+1]    echo $nu2 > /tmp/$log.txt        if [ $nu2 -gt 10 ]  // 10钟后发告警    then         ./mail.py  $1 "trouble continue 10 min $2" "$3"         echo "0" > /tmp/$log.txt  //重新计数    fifi

mail.sh脚本说明

这个脚本实现的核心是计数器和计时器的功能,配合crond服务进行周期性执行,控制告警周期。

计时器代码块

log=$1t_s=`date +%s`   t_s2=`date -d "2 hours ago" +%s`if [ ! -f /tmp/$log ]then    echo $t_s2 > /tmp/$logfit_s2=`tail -1 /tmp/$log | awk '{print $1}'`echo $t_s>>/tmp/$logv=$[$t_s-$t_s2]echo $vif [ $v -gt 3600 ]  then    ./mail.py  $1  $2  $3    echo "0" > /tmp/$log.txtelse   #先不看fi

说明的代码实现的就是计时器的功能:首先判断计时日志文件是否存在

  • 文件不存在,表示为新服务器,给予2小时前的时间戳;这样后续t_s2变量从文件内获取的时间就是新赋值的时间,时间间隔肯定大于3600,进入判断语句,立即发送告警邮件;
  • 文件存在,获取到的时间就为mail.sh执行间隔时间,这里假设为1分钟即60s,这样在进入判断时执行的就是下面的计数器代码了;

计数器代码

if [ $v -gt 3600 ]  then    ./mail.py  $1  $2  $3    echo "0" > /tmp/$log.txtelse    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     fifi
  • 第二次执行mail.sh时,此时/tmp/$log.txt应该为空,直接赋值0,开始计数,执行之后的代码值变为1;
  • 之后每次执行mail.sh,计数器值+1,当计数器值大于10,即10分钟过后,发送告警邮件,并再次清空计数器,重新计数;

运行告警系统

最终的目录结构

[root@localhost ~]# tree /usr/local/sbin/mon/usr/local/sbin/mon├── bin│   └── main.sh├── conf│   └── mon.conf├── log├── mail│   ├── mail.py│   └── mail.sh└── shares    ├── 502.sh    ├── disk.sh    └── load.sh

编写cron计划

# 每分钟执行一次,这样告警时间间隔收敛至10分钟,这里必须进入到/usr/local/sbin/mon/bin目录下[root@localhost ~]# crontab -e* * * * * cd /usr/local/sbin/mon/bin; bash main.sh

转载于:https://my.oschina.net/LuCastiel/blog/1624439

你可能感兴趣的文章
采用JXL包进行EXCEL数据写入操作
查看>>
将txt文件转化为json进行操作
查看>>
我的2014-相对奢侈的生活
查看>>
Java设计模式
查看>>
华为OJ 名字美丽度
查看>>
mysql-This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
查看>>
基本概念复习
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
【数据库】
查看>>
WindowManager.LayoutParams 详解
查看>>
Linux中rc的含义
查看>>
安卓中数据库的搭建与使用
查看>>
AT3908 Two Integers
查看>>
.NET 设计规范--.NET约定、惯用法与模式-2.框架设计基础
查看>>
win7 64位+Oracle 11g 64位下使用 PL/SQL Developer 的解决办法
查看>>
sql 内联,左联,右联,全联
查看>>
C++关于字符串的处理
查看>>
Breaking parallel loops in .NET C# using the Stop method z
查看>>
[轉]redis;mongodb;memcache三者的性能比較
查看>>