shell报警系统
shell報(bào)警系統(tǒng)
- 一、創(chuàng)建主目錄和子目錄
- 1.在/usr/local/sbin/下創(chuàng)建
- 2.并且在bin下創(chuàng)建主腳本(網(wǎng)卡為自己的!!)
- 3.進(jìn)入conf目錄
- 二、配置監(jiān)控子程序
- 1.load程序
- (1)進(jìn)入shares目錄
- (2)編輯load.sh文件
- 2.502.sh
- (1)編輯502.sh
- 3.disk.sh
- (1)編輯disk.sh
- 三、配置告警系統(tǒng)郵件引擎
- 1.mail.py
- (1)進(jìn)入mail目錄
- (2)編輯mail.py,負(fù)責(zé)發(fā)送郵箱
- 2.編寫mail.sh文件
- 四、測(cè)試
一、創(chuàng)建主目錄和子目錄
1.在/usr/local/sbin/下創(chuàng)建
cd /usr/local/sbin/
mkdir mon
cd mon/
mkdir bin conf shares mail log
2.并且在bin下創(chuàng)建主腳本(網(wǎng)卡為自己的!!)
vi /bin/main.sh腳本內(nèi)容:
#!/bin/bash #是否發(fā)送郵件的開關(guān) export send=1 #過濾ip地址 export addr=`/sbin/ifconfig |grep -A1 "ens192: "|awk '/inet/ {print $2}'` dir=`pwd` #只需要最后一級(jí)目錄名 last_dir=`echo $dir|awk -F'/' '{print $NF}'` #下面的判斷目的是,保證執(zhí)行腳本的時(shí)候,我們?cè)赽in目錄里,不然監(jiān)控腳本、郵件和日志很有可能找不到 if [ $last_dir == "bin" ] || [ $last_dir == "bin/" ]; thenconf_file="../conf/mon.conf" elseecho "you shoud cd bin dir"exit fi exec 1>>../log/mon.log 2>>../log/err.log echo "`date +"%F %T"` load average" /bin/bash ../shares/load.sh #先檢查配置文件中是否需要監(jiān)控502 if grep -q 'to_mon_502=1' $conf_file; thenexport log=`grep 'logfile=' $conf_file |awk -F '=' '{print $2}' |sed 's/ //g'`/bin/bash ../shares/502.sh fi3.進(jìn)入conf目錄
cd ../conf編輯mon.conf文件(這個(gè)文件就是我們項(xiàng)目各個(gè)程序的主開關(guān),負(fù)責(zé)各個(gè)程序是否監(jiān)控)
內(nèi)容:
## to config the options if to monitor ## 定義mysql的服務(wù)器地址、端口以及user、password to_mon_cdb=0 ##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則監(jiān)控,為0不監(jiān)控 to_mon_httpd=0 ## php 如果是1則監(jiān)控,為0不監(jiān)控 to_mon_php_socket=0 ## http_code_502 需要定義訪問日志的路徑 to_mon_502=0 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二、配置監(jiān)控子程序
(郵箱都為收件人郵箱)
主要有三個(gè)程序,分別是load.sh、502.sh、disk.sh。都放在shares目錄下
1.load程序
核心就是利用uptime命令取程序最近一分鐘的負(fù)載值做判斷,如果值大于我們?cè)O(shè)定的閾值就發(fā)送郵件告警
(1)進(jìn)入shares目錄
cd ../shares(2)編輯load.sh文件
vi load.sh內(nèi)容:
#!/bon/bash ##Writen by ## load=`uptime |awk -F 'average:' '{print $2}'|cut -d',' -f1|sed 's/ //g' |cut -d. -f1` if [ $load -gt 0 ] && [ $send -eq "1" ] then/bin/bash ../mail/mail.sh 1820157360@qq.com "$addr\_load:$load" "$addr `date +%T` load is $load" fi echo "`date +%T` load is $load"2.502.sh
核心就是監(jiān)控nginx運(yùn)行日志一分鐘502出現(xiàn)的次數(shù),如果大于我們?cè)O(shè)定的閾值就發(fā)送郵件告警。這個(gè)腳本需要在conf目錄下mon.conf設(shè)置502運(yùn)行日志的目錄位置。
(1)編輯502.sh
vi 502.sh內(nèi)容:
#!/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/bin/bash ../mail/mail.sh 1820157360@qq.com "$addr\_502 $c_502" "$addr `date +%T` load is $load" fi echo "`date +%T` 502 $c_502"3.disk.sh
核心思想就是利用for循環(huán)遍歷每個(gè)分區(qū)的磁盤利用率,如果有分區(qū)磁盤利用率超過設(shè)定的閾值就發(fā)送告警郵件。
(1)編輯disk.sh
vi disk.sh內(nèi)容:
#!/bin/bash ##Writen by ## rm -f ../log/disk.tmp for r in `df -h |awk -F '[ %]+' '{print $5}'|grep -v Use` doif [ $r -gt 90 ] && [ $send -eq "1" ] then/bin/bash ../mail/mail.sh 1820157360@qq.com "$addr\_disk $r" "$addr `date +%T` disk useage is $r `df -h` "echo "`date +%T` disk useage is nook `df -h`" fielseecho "`date +%T` disk useage is ok `df -h`" fi三、配置告警系統(tǒng)郵件引擎
引擎由兩個(gè)文件構(gòu)成,都在mail目錄下,mail.py負(fù)責(zé)發(fā)送郵件,mail.sh負(fù)責(zé)告警收斂。
1.mail.py
(1)進(jìn)入mail目錄
cd /mail(2)編輯mail.py,負(fù)責(zé)發(fā)送郵箱
(發(fā)送郵箱用自己的必須是163郵箱,授權(quán)碼在設(shè)置里開啟smtp服務(wù),獲取授權(quán)碼)
vi /mail.py內(nèi)容:
sender = mailfrom# 郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個(gè)郵件地址群發(fā)receivers = [mailto]# 設(shè)置email信息# 郵件內(nèi)容設(shè)置message = MIMEText(content, 'plain', 'utf-8')# 郵件主題message['Subject'] = subject# 發(fā)送方信息message['From'] = mailfrom# 接受方信息message['To'] = mailto# 登錄并發(fā)送郵件try:smtpObj = smtplib.SMTP()# 連接到服務(wù)器smtpObj.connect(mail_host, 25)# 登錄到服務(wù)器smtpObj.login(mail_user, mail_pass)# 發(fā)smtpObj.sendmail(sender, receivers, message.as_string())# 退出smtpObj.quit()print('success')except smtplib.SMTPException as e:print('error', e) # 打印錯(cuò)誤if __name__ == "__main__":to=sys.argv[1]subject=sys.argv[2]content=sys.argv[3]# 郵箱賬號(hào) 授權(quán)碼 發(fā)送人郵箱 sendqqmail('tjd_11','CVEBVBFIQQGZCIKI','tjd_11@163.com',to,subject,content)2.編寫mail.sh文件
負(fù)責(zé)告警收斂的,如果每次運(yùn)行腳本出現(xiàn)問題都發(fā)送郵件就太煩人了,所以就有了這個(gè)告警收斂腳本。這個(gè)腳本設(shè)置了三種場(chǎng)景,分別是第一次執(zhí)行腳本如果有警告就發(fā)送郵件、業(yè)務(wù)連續(xù)報(bào)警十分鐘再發(fā)送一封郵件和業(yè)務(wù)間斷的報(bào)警一小時(shí)內(nèi)滿十分鐘就報(bào)警一次。
vi mail.sh內(nèi)容:
log=$2 t_s=`date +%s` t_s2=`date -d "2 hours ago" +%s` if [ ! -f /tmp/$log ] thenecho $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 ] thenpython3 ../mail/mail.py "$1" "$2" "$3"echo "0" > /tmp/$log.txt elseif [ ! -f /tmp/$log.txt ]thenecho "0" > /tmp/$log.txtfinu=`cat /tmp/$log.txt`nu2=$[$nu+1]echo $nu2>/tmp/$log.txtif [ $nu2 -gt 10 ]thenpython3 ../mail/mail.py $1 "trouble continue 10 min $2" "$3"echo "0" > /tmp/$log.txtfi fi四、測(cè)試
這里我們只測(cè)試linux負(fù)載情況下load.sh這個(gè)腳本
1.首先我們需要安裝python3環(huán)境和net-tools
2.如果是真實(shí)需求,這個(gè)腳本需要寫入到crontab當(dāng)中去,我們這里因?yàn)槭菧y(cè)試就先不要寫進(jìn)去了。
3.因?yàn)槭菧y(cè)試我們先把日志關(guān)掉,編輯main.sh,注釋掉main.sh腳本exec那一行。
4.我們要把load.sh腳本改成滿足我們?cè)O(shè)定的閾值,所以改一下判斷條件當(dāng)系統(tǒng)負(fù)載大于0時(shí)我們就告警。
5.執(zhí)行程序
(1)需要把負(fù)載增加到條件值,可以寫一個(gè)無限循環(huán)輸出腳本
vi a.sh
可用uptime命令查看負(fù)載是否達(dá)到目標(biāo)
uptime(2)執(zhí)行主程序
收到郵箱
總結(jié)
- 上一篇: 网页前端之字幕滚动实现
- 下一篇: 华为系统更新后通知栏变大了_华为EMUI