配置文件(必定要放到conf目錄下,名稱必須爲mon.conf ——PS:不能隨意改動,由於在主腳本中已經設置好了)php
定義一些開關,定義一些對應的日誌路徑,或者說監控mysql的用戶名和密碼,以及IP地址port端口等python
[root@garytao-01 bin]# cd .. [root@garytao-01 mon]# vim conf/mon.conf 例子,增長如下內容(內容根據需求更改): ## to config the options if to monitor ## 定義mysql的服務器地址、端口以及user、password to_mon_cdb=0 ##cdb等於0 or 1, default 0,0 not monitor, 1 monitor 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 logfile=/data/log/xxx.xxx.com/access.log ## request_count 定義日誌路徑以及域名 to_mon_request_count=0 req_log=/data/log/www.discuz.net/access.log domainname=www.discuz.net
第一個load.sh是必需要有的,由於在主腳本中已經定義了任何一臺機器都要監控系統負載mysql
[root@garytao-01 mon]# cd shares/ [root@garytao-01 shares]# vim load.sh 增長以下腳本內容: #! /bin/bash ##Writen by aming## load=`uptime |awk -F 'average:' '{print $2}'|cut -d',' -f1|sed 's/ //g' |cut -d. -f1` #計算系統負載 if [ $load -gt 10 ] && [ $send -eq "1" ] then echo "$addr `date +%T` load is $load" >../log/load.tmp #這條命令的目的是爲了發送日誌 /bin/bash ../mail/mail.sh aming_test@163.com "$addr\_load:$load" `cat ../log/load.tmp` fi echo "`date +%T` load is $load"
502.sh內容(502確定須要一個日誌),502涉及到一個訪問日誌,訪問日誌又設計到一個時間linux
[root@garytao-01 shares]# vim 502.sh 增長以下腳本內容: #! /bin/bash d=`date -d "-1 min" +%H:%M` c_502=`grep :$d: $log |grep ' 502 '|wc -l` #截取一分鐘之前的時間 if [ $c_502 -gt 10 ] && [ $send == 1 ]; then echo "$addr $d 502 count is $c_502">../log/502.tmp /bin/bash ../mail/mail.sh $addr\_502 $c_502 ../ #mail就是定義發送給誰,發送的主題,發送的內容log/502.tmp fi echo "`date +%T` 502 $c_502"
disk.sh內容(磁盤使用率)sql
[root@garytao-01 shares]# vim disk.sh 增長以下腳本內容: #! /bin/bash ##Writen by aming## rm -f ../log/disk.tmp LANG=en for r in `df -h |awk -F '[ %]+' '{print $5}'|grep -v Use` #[ %]+ 以 多個,空格 或者 % 做爲分隔符,+號表示一個或多個;由於系統默認是英文,因此grep -v Use 過濾掉的就是 已用 do if [ $r -gt 90 ] && [ $send -eq "1" ] then echo "$addr `date +%T` disk useage is $r" >>../log/disk.tmp fi 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` disk useage is nook" else echo "`date +%T` disk useage is ok" fi #awk指定多個分隔符 [root@xietaolinux1 mon]# echo "12:aa#123bb:22#ww" |awk -F '[:#]' '{print $3}' 123bb [root@xietaolinux1 mon]# echo "12:aa#123bb:22#ww" |awk -F '[:#]' '{print NF}' 5 [root@xietaolinux1 mon]# echo "12:aa#123bb:22##ww" |awk -F '[:#]' '{print NF}' 6 [root@xietaolinux1 mon]# echo "12:aa#123bb:22##ww" |awk -F '[:#]+' '{print NF}' 5
[root@garytao-01 mon]# cd mail/ [root@garytao-01 mail]# vim mail.py 增長以下內容: #!/usr/bin/env python #-*- coding: UTF-8 -*- import os,sys reload(sys) sys.setdefaultencoding('utf8') import getopt import smtplib from email.MIMEText import MIMEText from email.MIMEMultipart import MIMEMultipart from subprocess import * def sendqqmail(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, 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('1234567@qq.com','aaaaaaaaaa','1234567@qq.com',to,subject,content) if __name__ == "__main__": main() #####腳本使用說明###### #1. 首先定義好腳本中的郵箱帳號和密碼 #2. 腳本執行命令爲:python mail.py 目標郵箱 "郵件主題" "郵件內容"
在mail目錄下建立腳本mail.sh ,當系統服務異常的時候就會調用mail.shshell
[root@garytao-01 mail]# vim mail.sh 增長以下內容: #!/bin/bash log=$1 t_s=`date +%s` t_s2=`date -d "2 hours ago" +%s` #定義2個小時的時間戳 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 #當故障存在3600秒,就會進行告警 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
[root@garytao-01 mail]# pwd /usr/local/sbin/mon/mail #要執行告警系統,確定要是每分鐘,執行一次 [root@garytao-01 mail]# crontab -e
[root@garytao-01 mail]# cd /usr/local/sbin/mon/bin/ [root@garytao-01 bin]# sh -x main.sh + export send=1 + send=1 ++ /sbin/ifconfig ++ grep -A1 'ens33: ' ++ awk '/inet/ {print $2}' + export addr=172.16.111.100 + addr=172.16.111.100 ++ 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 + exec #查看日誌 [root@garytao-01 bin]# cat ../log/err.log ++ date '+%F %T' + echo '2018-02-07 17:01:39 load average' + /bin/bash ../shares/load.sh + grep -q to_mon_502=1 ../conf/mon.conf ++ grep logfile= ../conf/mon.conf ++ awk -F = '{print $2}' ++ sed 's/ //g' + export log=/data/log/xxx.xxx.com/access.log + log=/data/log/xxx.xxx.com/access.log + $'/bin/bash\302\240\302\240../shares/502.sh' main.sh:行23: /bin/bash ../shares/502.sh: 沒有那個文件或目錄 #不須要寫入502 [root@garytao-01 bin]# vi ../conf/mon.conf #暫時註釋掉日誌 [root@garytao-01 bin]# vi main.sh
#從新執行腳本 [root@garytao-01 bin]# sh -x main.sh + export send=1 + send=1 ++ grep -A1 'ens33: ' ++ awk '/inet/ {print $2}' ++ /sbin/ifconfig + export addr=172.16.111.100 + addr=172.16.111.100 ++ 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-02-26 19:02:10 load average' 2018-02-26 19:02:10 load average + /bin/bash ../shares/load.sh 19:02:10 load is 0 + grep -q to_mon_502=1 ../conf/mon.conf [root@garytao-01 bin]# bash ../shares/load.sh 19:03:04 load is 0 [root@garytao-01 bin]# cd .. [root@garytao-01 mon]# cd mail/ [root@garytao-01 mail]# ls mail.py mail.sh [root@garytao-01 mail]# vi mail.sh [root@garytao-01 mail]# cd .. [root@garytao-01 mon]# cd shares/ [root@garytao-01 shares]# ls 502.sh disk.sh load.sh [root@garytao-01 shares]# vim load.sh