2018-4-24 17周5次课 告警系统邮件引擎

20.23/20.24/20.25 告警系统邮件引擎


·mail.sh内容

其中 mail.py 内容到这里下载https://note.youdao.com/share/?id=dac98a142b86abba9b118e113969d4c4&type=note#/

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

理解:

第一次告警,之前没有告警过,没执行过mail.sh

t_s为现在时间,t_s2为目前时间前2小时,时间差为7200秒

那么如果$log(在mon.conf中定义的logfile)不存在,则把2小时前的时间戳写入到$log中,也就是7200

t_s2为7200,把t_s追加到$log中

差值t_s和t_s2差值v等于7200,大于3600,所有发邮件告警mail.py,并且计数 0 到 $log.txt中

第一次告警结束

mail.sh一分钟执行一次,第二次执行时

t_s2=`tail -1 /tmp/$log|awk '{print $1}'`会把t_s2=`date -d "2 hours ago" +%s`的值覆盖掉,因此

t_s2为1分钟前的时间,因为$log为1分钟前,然后在追加现在时间到$log

差值v是60,小于3600,不告警,直接计数

那么执行else,判断$log.txt是否存在,第二次执行时不存在,所有计数0到$log.txt中,结束判断

因此nu=0,nu2=1,把nu2也就是1计数写入到$log.txt中

判断nu2是否大于10,那么显然不大于10,直接结束判断,结束脚本

第三次执行时,跟第二次类似,只不过计数会变化,nu=1,nu2=2

以此类推,在最后一次告警10分钟后,nu=10,nu2=11>10,那么符合if [ $nu2 -gt 10 ]的判断,执行mail.py告警,并把计数器重新清为0

如果之后没有问题,不会执行mail.sh,如果有问题,每一分钟执行一次mail.sh,十分钟后如果问题没有解决,再发邮件告警






20.26 运行告警系统


把main.sh加入crontab,一分钟执行一次

[[email protected] shares]# crontab -e

* * * * * cd /usr/local/sbin/mon/bin;bash main.sh

[[email protected] bin]# sh -x main.sh
+ export send=1
+ send=1
++ grep -A1 'ens33: '
++ awk '/inet/ {print $2}'
++ /sbin/ifconfig
+ export addr=192.168.65.128
+ addr=192.168.65.128
++ pwd
+ dir=/usr/local/sbin/mon/bin
++ echo /usr/local/sbin/mon/bin
++ awk -F/ '{print $NF}'
+ last_dir=bin
+ '[' bin == bin ']'
+ conf_file=../conf/mon.conf
++ date '+%F %T'
+ echo '2018-04-23 22:23:48 load average'
2018-04-23 22:23:48 load average
+ /bin/bash ../shares/load.sh
22:23:48 load is 0
+ grep -q to_mon_502=1 ../conf/mon.conf
++ awk -F = '{print $2}'
++ sed 's/ //g'
++ grep logfile= ../conf/mon.conf
+ export log=/data/log/xxx.xxx.com/access.log
+ log=/data/log/xxx.xxx.com/access.log
+ /bin/bash ../shares/502.sh
grep: /data/log/xxx.xxx.com/access.log: No such file or directory
22:23:48 502 0

mail.sh 中的 $1,$2,$3 就是mail.py中的 to=sys.argv[1],subject=sys.argv[2],content=sys.argv[3]  三个参数,$1发送给谁,$2主题,$3内容

·如果load.sh有问题,那么它发告警,那么也是要带三个参数的,给谁发,主题,内容

(第三个参数也可以cat,把内容作为第三个参数)









原文地址:http://blog.51cto.com/11530642/2107007

时间: 2024-07-31 01:33:42

2018-4-24 17周5次课 告警系统邮件引擎的相关文章

2018.4.23 17周4次课

十七周4次课(4月23日) 20.20 告警系统主脚本 20.21 告警系统配置文件 20.22 告警系统监控项目 20.20 告警系统主脚本 创建告警系统的目录: [[email protected] /usr/local/sbin]# mkdir mon [[email protected] /usr/local/sbin]# ls mon  nginx_log_rotate.sh [[email protected] /usr/local/sbin]# cd mon [[email pro

2018.1.24 7周3次课

七周三次课(1月24日) 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法 10.11 Linux网络相关 用ifconfig命令查看网卡IP 前面曾用过ip addr这个命令来查看系统的IP地址.其实在centos 7之前,我们使用最多的命令是ifconfig,它类似于Windows的ipconfig命令,后面不加任何选项和参数时,只打印当前网卡的相关信息 (如子网掩码. 网关等).

2018.4.18 17周1次课

十七周一次课(4月18日) 20.5 shell脚本中的逻辑判断 20.6 文件目录属性判断 20.7 if特殊用法 20.8/20.9 case判断 20.5 shell脚本中的逻辑判断 格式1不带else:if 条件 ; then 语句; fi 编辑if1.sh文件:vi if1.sh #!/bin/bash/ a=5 if [ $a -gt 3 ] then echo ok fi 格式2带有else:if 条件; then 语句; else 语句; fi #!/bin/bash/ a=1

2018.4.19 17周2次课

十七周二次课(4月19日) 20.10 for循环 20.11/20.12 while循环 20.13 break跳出循环 20.14 continue结束本次循环 20.15 exit退出整个脚本 20.10 for循环 for循环结构是在日常运维工作中使用最频繁的循环结构. 语法:for 变量名 in 条件; do -; done 数字循环:vi for1.sh #!/bin/bash sum=0 for i in `seq 1 3` #循环的条件还可以引用系统命令的执行结果(如seq 1

20.23 20.24 20.25 告警系统邮件引擎20.26 运行告警系统

20.23 20.24 20.25 告警系统邮件引擎把之前zabbix设置好的邮件拷贝到mail目录下cd /usr/local/sbin/mon/mailvim mail.sh 这个脚本的目的是做告警收敛的,就是服务没有恢复超过一定时间才会告警log=$1t_s=date +%s 当前的时间戳t_s2=date -d "2 hours ago" +%s 2个小时以 前的时间戳if [ ! -f /tmp/$log ] 如果 没有这个文件thenecho $t_s2 > /tmp

2018.3.1 10周2次课

十周第二次课(3月1日) 11.14/11.15 Apache和PHP结合 11.16/11.17 Apache默认虚拟主机 11.14/11.15 Apache和PHP结合 配置httpd支持php httpd主配置文件/usr/local/apache2.4/conf/httpd.conf vim /usr/local/apache2.4/conf/httpd.conf   //修改以下4个地方 ServerName 搜索ServerName,把#ServerName www.example

2018.1.9 5周2次课

五周第二次课(1月9日) 7.6 yum更换国内源 7.7 yum下载rpm包 7.8/7.9 源码包安装 7.6 yum更换国内源 1.恢复之前备份的文件 2. 进入"/etc/yum.repos.d"目录 3.删除"CentOS-Base.repo"文件 4.下载"163.repo"文件 wget http://mirrors.163.com/.help/CentOS7-Base-163.repo curl -O http://mirrors

2018.1.16 6周2次课

六周第二次课(1月16日) 9.4/9.5 sed 9.4/9.5 sed 其实grep工具的功能还不够强大,它实现的只是查找功能,而不能把查找的内容替换.以前用vim操作文档的时候,可以查找也可以替换, 但只限于在文本内部操作,而不能输出到屏幕上.sed工具以及后面要介绍的awk工具就能把替换的文本输出到屏幕上,而且还有其他更丰富的功能.sed和awk都是流式编辑器,是针对文档的行来操作的. sed  '/x/'p filename:匹配x字符 sed  -n  '/x/'p  filenam

2018-4-20 17周3次课 shell函数、数组、告警需求分析

20.16/20.17 shell中的函数 ·函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function f_name() { command } 函数必须要放在最前面 ·示例1 #!/bin/bash input() {                        ##定义f_name最好不要和shell里面的关键词冲突     echo $1 $2 $# $0 } input 1 a b $1 $2 第一个,第