main.sh 主要制腳本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<code>#!/bin/bash</code>
<code># 是否發送郵件的開關(維護模式下我們需要關閉此功能,監控還是繼續,但不發任何郵件。)</code>
<code>export</code> <code>send=1</code>
<code># 過濾ip位址(一旦報警,需要需要知道是哪台機器的IP,沒有服務端,全部都是獨立運作的。監控的網卡可以修改,也可更改為hostname)</code>
<code>export</code> <code>addr=`</code><code>/sbin/ifconfig</code> <code>|</code><code>grep</code> <code>-A1 </code><code>"ens33: "</code><code>|</code><code>awk</code> <code>'/inet/ {print $2}'</code><code>`</code>
<code>dir</code><code>=`</code><code>pwd</code><code>`</code>
<code># 隻需要最後一級目錄名</code>
<code>last_dir=`</code><code>echo</code> <code>$</code><code>dir</code><code>|</code><code>awk</code> <code>-F</code><code>'/'</code> <code>'{print $NF}'</code><code>`</code>
<code># 下面的判斷目的是,保證執行腳本的時候,我們在bin目錄裡,不然監控腳本、郵件和日志很有可能找不到(腳本中涉及的目錄幾乎都是相對路徑。)!!</code>
<code>if</code> <code>[ $last_dir == </code><code>"bin"</code> <code>] || [ $last_dir == </code><code>"bin/"</code> <code>]; </code><code>then</code>
<code> </code><code>conf_file=</code><code>"../conf/mon.conf"</code>
<code>else</code>
<code> </code><code>echo</code> <code>"you shoud cd bin dir"</code>
<code> </code><code>exit</code>
<code>fi</code>
<code>exec</code> <code>1>>..</code><code>/log/mon</code><code>.log 2>>..</code><code>/log/err</code><code>.log</code>
<code>echo</code> <code>"`date +"</code><code>%F %T</code><code>"` load average"</code>
<code>/bin/bash</code> <code>..</code><code>/shares/load</code><code>.sh</code>
<code>#先檢查配置檔案中是否需要監控502</code>
<code>if</code> <code>grep</code> <code>-q </code><code>'to_mon_502=1'</code> <code>$conf_file; </code><code>then</code>
<code> </code><code>export</code> <code>log=`</code><code>grep</code> <code>'logfile='</code> <code>$conf_file |</code><code>awk</code> <code>-F </code><code>'='</code> <code>'{print $2}'</code> <code>|</code><code>sed</code> <code>'s/ //g'</code><code>`</code>
<code> </code><code>/bin/bash</code> <code>..</code><code>/shares/502</code><code>.sh</code>
mon.conf 配置檔案
<code>## to config the options if to monitor</code>
<code>## 定義mysql的伺服器位址、端口以及user、password(如下的cdb是我目前的資料庫,可選擇監控與否)</code>
<code>to_mon_cdb=0 </code><code>##0 or 1, default 0,0 not monitor, 1 monitor</code>
<code>db_ip=10.20.3.13</code>
<code>db_port=3315</code>
<code>db_user=username</code>
<code>db_pass=</code><code>passwd</code>
<code>## httpd 如果是1則監控,為0不監控</code>
<code>to_mon_httpd=0</code>
<code>## php 如果是1則監控,為0不監控</code>
<code>to_mon_php_socket=0</code>
<code>## http_code_502 需要定義通路日志的路徑(配合如上主腳本,如果to_mon_502=1 就會開啟監控報警)</code>
<code>to_mon_502=1</code>
<code>logfile=</code><code>/data/log/xxx</code><code>.xxx.com</code><code>/access</code><code>.log</code>
<code>## request_count 定義日志路徑以及域名(監控請求數,如上說明0 或者1開關與否)</code>
<code>to_mon_request_count=0</code>
<code>req_log=</code><code>/data/log/www</code><code>.xxx.com</code><code>/access</code><code>.log</code>
<code>domainname=www.xxx.com</code>
load.sh 告警系統
<code>#! /bin/bash</code>
<code>load=`uptime |</code><code>awk</code> <code>-F </code><code>'average:'</code> <code>'{print $2}'</code><code>|</code><code>cut</code> <code>-d</code><code>','</code> <code>-f1|</code><code>sed</code> <code>'s/ //g'</code> <code>|</code><code>cut</code> <code>-d. -f1`</code>
<code>if</code> <code>[ $load -gt 10 ] && [ $send -</code><code>eq</code> <code>"1"</code> <code>]</code>
<code>then</code>
<code> </code><code>echo</code> <code>"$addr `date +%T` load is $load"</code> <code>>..</code><code>/log/load</code><code>.tmp</code>
<code> </code><code>/bin/bash</code> <code>..</code><code>/mail/mail</code><code>.sh </code><code>test</code><code>@163.com </code><code>"$addr\_load:$load"</code> <code>`</code><code>cat</code> <code>..</code><code>/log/load</code><code>.tmp`</code>
<code>echo</code> <code>"`date +%T` load is $load"</code>
502.sh 告警系統
<code>d=`</code><code>date</code> <code>-d </code><code>"-1 min"</code> <code>+%H:%M`</code>
<code>c_502=`</code><code>grep</code> <code>:$d: $log |</code><code>grep</code> <code>' 502 '</code><code>|</code><code>wc</code> <code>-l`</code>
<code>if</code> <code>[ $c_502 -gt 10 ] && [ $send == 1 ]; </code><code>then</code>
<code> </code><code>echo</code> <code>"$addr $d 502 count is $c_502"</code><code>>..</code><code>/log/502</code><code>.tmp</code>
<code> </code><code>/bin/bash</code> <code>..</code><code>/mail/mail</code><code>.sh $addr\_502 $c_502 ..</code><code>/log/502</code><code>.tmp</code>
<code>echo</code> <code>"`date +%T` 502 $c_502"</code>
disk.sh 告警系統
<code>rm</code> <code>-f ..</code><code>/log/disk</code><code>.tmp</code>
<code>## 用空格或者%為分隔符,篩選出來磁盤使用量的百分比。</code>
<code>for</code> <code>r </code><code>in</code> <code>`</code><code>df</code> <code>-h |</code><code>awk</code> <code>-F </code><code>'[ %]+'</code> <code>'{print $5}'</code><code>|</code><code>grep</code> <code>-</code><code>v</code> <code>Use`</code>
<code>do</code>
<code> </code><code>if</code> <code>[ $r -gt 90 ] && [ $send -</code><code>eq</code> <code>"1"</code> <code>]</code>
<code> </code><code>echo</code> <code>"$addr `date +%T` disk useage is $r"</code> <code>>>..</code><code>/log/disk</code><code>.tmp</code>
<code> </code><code>fi</code>
<code>done</code>
<code>if</code> <code>[ -f ..</code><code>/log/disk</code><code>.tmp ]</code>
<code> </code><code>df</code> <code>-h >> ..</code><code>/log/disk</code><code>.tmp</code>
<code> </code><code>/bin/bash</code> <code>..</code><code>/mail/mail</code><code>.sh $addr\_disk $r ..</code><code>/log/disk</code><code>.tmp</code>
<code> </code><code>echo</code> <code>"`date +%T` disk useage is nook"</code>
<code> </code><code>echo</code> <code>"`date +%T` disk useage is ok"</code>
mail.sh 告警收斂
25
26
27
28
29
<code>log=$1 </code><code>//log</code><code>作為一個變量,接收來自第一個參數的值</code>
<code>t_s=`</code><code>date</code> <code>+%s` </code><code>//</code><code>時間戳</code>
<code>t_s2=`</code><code>date</code> <code>-d </code><code>"2 hours ago"</code> <code>+%s` </code><code>//</code><code>兩個小時前的時間戳</code>
<code>if</code> <code>[ ! -f </code><code>/tmp/</code><code>$log ] </code><code>//</code><code>如果日志檔案不存在</code>
<code> </code><code>echo</code> <code>$t_s2 > </code><code>/tmp/</code><code>$log </code><code>//</code><code>把兩個小時前的時間戳寫到日志</code>
<code>t_s2=`</code><code>tail</code> <code>-1 </code><code>/tmp/</code><code>$log|</code><code>awk</code> <code>'{print $1}'</code><code>` </code><code>//</code><code>截取時間戳</code>
<code>echo</code> <code>$t_s>></code><code>/tmp/</code><code>$log </code><code>//</code><code>追加目前時間戳</code>
<code>v</code><code>=$[$t_s-$t_s2] </code><code>//</code><code>時間戳的時間差(以秒為機關)詳情如下1</code>
<code>echo</code> <code>$</code><code>v</code>
<code>if</code> <code>[ $</code><code>v</code> <code>-gt 3600 ] </code><code>//</code><code>在此也就是,當過了1小時如果還是沒有恢複再次發告警郵件。調用mail.py(如果沒有恢複,每1小時發一次)</code>
<code> </code><code>.</code><code>/mail</code><code>.py $1 $2 $3</code>
<code> </code><code>echo</code> <code>"0"</code> <code>> </code><code>/tmp/</code><code>$log.txt </code><code>//</code><code>生成一個新的.txt日志。用來記錄告警</code>
<code> </code><code>if</code> <code>[ ! -f </code><code>/tmp/</code><code>$log.txt ] </code><code>//</code><code>判斷有沒有這個日志檔案</code>
<code> </code><code>then</code>
<code> </code><code>echo</code> <code>"0"</code> <code>> </code><code>/tmp/</code><code>$log.txt </code><code>//</code><code>計數器</code>
<code> </code><code>nu=`</code><code>cat</code> <code>/tmp/</code><code>$log.txt` </code><code>//</code><code>檢視計數器</code>
<code> </code><code>nu2=$[$nu+1] </code><code>//</code><code>計數器+1</code>
<code> </code><code>echo</code> <code>$nu2></code><code>/tmp/</code><code>$log.txt </code><code>//</code><code>把計數器寫入日志檔案</code>
<code> </code><code>if</code> <code>[ $nu2 -gt 10 ] </code>
<code> </code><code>.</code><code>/mail</code><code>.py $1 </code><code>"trouble continue 10 min $2"</code> <code>"$3"</code> <code>//</code><code>代表着已經持續了10分鐘了</code>
<code> </code><code>echo</code> <code>"0"</code> <code>> </code><code>/tmp/</code><code>$log.txt </code><code>//</code><code>重新開始計數</code>
mail.py 發郵件腳本
30
31
32
33
34
35
36
37
<code>#####腳本使用說明######</code>
<code>#1. 首先定義好腳本中的郵箱賬号和密碼</code>
<code>#2. 腳本執行指令為:python mail.py 目标郵箱 "郵件主題" "郵件内容"</code>
<code>#!/usr/bin/env python</code>
<code>#-*- coding: UTF-8 -*-</code>
<code>import</code> <code>os,sys</code>
<code>reload(sys)</code>
<code>sys.setdefaultencoding(</code><code>'utf8'</code><code>)</code>
<code>import</code> <code>getopt</code>
<code>import</code> <code>smtplib</code>
<code>from email.MIMEText </code><code>import</code> <code>MIMEText</code>
<code>from email.MIMEMultipart </code><code>import</code> <code>MIMEMultipart</code>
<code>from subprocess </code><code>import</code> <code>*</code>
<code>def sendqqmail(username,password,mailfrom,mailto,subject,content):</code>
<code> </code><code>gserver = </code><code>'smtp.qq.com'</code>
<code> </code><code>gport = 25</code>
<code> </code><code>try:</code>
<code> </code><code>msg = MIMEText(unicode(content).encode(</code><code>'utf-8'</code><code>))</code>
<code> </code><code>msg[</code><code>'from'</code><code>] = mailfrom</code>
<code> </code><code>msg[</code><code>'to'</code><code>] = mailto</code>
<code> </code><code>msg[</code><code>'Reply-To'</code><code>] = mailfrom</code>
<code> </code><code>msg[</code><code>'Subject'</code><code>] = subject</code>
<code> </code><code>smtp = smtplib.SMTP(gserver, gport)</code>
<code> </code><code>smtp.set_debuglevel(0)</code>
<code> </code><code>smtp.ehlo()</code>
<code> </code><code>smtp.login(username,password)</code>
<code> </code><code>smtp.sendmail(mailfrom, mailto, msg.as_string())</code>
<code> </code><code>smtp.close()</code>
<code> </code><code>except Exception,err:</code>
<code> </code><code>print </code><code>"Send mail failed. Error: %s"</code> <code>% err</code>
<code>def main():</code>
<code> </code><code>to=sys.argv[1]</code>
<code> </code><code>subject=sys.argv[2]</code>
<code> </code><code>content=sys.argv[3]</code>
<code> </code><code>sendqqmail(</code><code>'[email protected]'</code><code>,</code><code>'aaaaaaaaaa'</code><code>,</code><code>'[email protected]'</code><code>,to,subject,content) </code><code>//</code><code>定義QQ郵箱的賬号和密碼</code>
<code>if</code> <code>__name__ == </code><code>"__main__"</code><code>:</code>
<code> </code><code>main()</code>
crontab 每分鐘執行一次
<code>*</code><code>/1</code> <code>* * * * </code><code>cd</code> <code>/usr/local/sbin/mon/bin</code><code>; </code><code>bash</code> <code>main.sh</code>
本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/2065224,如需轉載請自行聯系原作者