天天看點

Shell告警監控系統

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&gt;&gt;..</code><code>/log/mon</code><code>.log 2&gt;&gt;..</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 ] &amp;&amp; [ $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>&gt;..</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 ] &amp;&amp; [ $send == 1 ]; </code><code>then</code>

<code>    </code><code>echo</code> <code>"$addr $d 502 count is $c_502"</code><code>&gt;..</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 ] &amp;&amp; [ $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>&gt;&gt;..</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 &gt;&gt; ..</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 &gt; </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&gt;&gt;</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>&gt; </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>&gt; </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&gt;</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>&gt; </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,如需轉載請自行聯系原作者