2018-4-24 17周5次課 告警系統郵件引擎
·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,一分鐘執行一次
[root@localhost shares]# crontab -e
* * * * * cd /usr/local/sbin/mon/bin;bash main.sh
[root@localhost 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,把內容作為第三個參數)
2018-4-24 17周5次課 告警系統郵件引擎