天天看點

shell程式設計——告警系統

本人附注對本shell告警系統的認識。

需求: 使用shell定制各種個性化告警工具,但需要統一化管理、規範化管理。

思路:指定一個腳本包,包含主程式、子程式、配置檔案、郵件引擎、輸出日志等。

主程式:作為整個腳本的入口,是整個系統的命脈。

配置檔案:是一個控制中心,用它來開關各個子程式,指定各個相關聯的日志檔案。

子程式:這個才是真正的監控腳本,用來監控各個名額。

郵件引擎:是由一個php程式來實作,它可以定義發郵件的伺服器、發郵件人以及收郵件人。

輸出日志:整個監控系統要有日志輸出。

要求:我們的機器角色多種多樣,但是所有機器上都要部署同樣的監控系統,也就說所有機器不管什麼角色,整個程式架構都是一緻的,不同的地方在于根據不同的角色,定制不同的配置檔案。

程式架構:   

                                         (主目錄 mon)

                 ____________________|_______________________________

                |              |                    |                       |                             |

               bin          conf            shares                  mail                         log

           [main.sh] [ mon.conf] [load.sh 502.sh]  [mail.php mail.sh] [  mon.log  err.log ]

bin下是主程式

conf下是配置檔案

shares下是各個監控腳本

mail下是郵件引擎

log下是日志。

1.  main.sh

<code>#!/bin/bash</code>

<code>#Written by aming.</code>

<code># 是否發送郵件的開關</code>

<code>export</code> <code>send=1    </code><code>//</code><code>對send進行環境變量指派:1為開,0為關。如果關閉則郵件不會發送,當你已經知道并着手時可以将此設定為0</code>

<code># 過濾ip位址</code>

<code>export</code> <code>addr=`</code><code>/sbin/ifconfig</code> <code>|</code><code>grep</code> <code>-A1 </code><code>'eth0'</code> <code>|</code><code>grep</code> <code>addr: |</code><code>awk</code> <code>'{print $2}'</code><code>|</code><code>awk</code> <code>-F: </code><code>'{print $2}'</code><code>`         </code><code>//</code><code>對addr進行環境變量指派:addr=本機IP</code>

<code>dir</code><code>=`</code><code>pwd</code><code>`        </code><code>//dir</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>//awk</code><code>出最後一段内容即目前目錄</code>

<code># 下面的判斷目的是,保證執行腳本的時候,我們在bin目錄裡,不然監控腳本、郵件和日志很有可能找不到(但是我覺得這裡有bug,萬一main.sh的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>//</code><code>如果目錄存在則進行變量指派</code>

<code>else</code>

<code>    </code><code>echo</code> <code>"you shoud cd bin dir"</code>   <code>//</code><code>如果目錄不對則在視窗列印出提示,退出主程式</code>

<code>    </code><code>exit</code>

<code>fi</code>

<code>#目錄正确條件下</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>//</code><code>标準輸出追加重定向到mon.log;錯誤追加到err.log</code>

<code>echo</code> <code>"`date +"</code><code>%F %T</code><code>"` load average"</code>   <code>//</code><code>列印出 時間 ,執行load.sh腳本</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>//grep</code> <code>-q 隻作為判斷條件,若1則對log進行環境變量指派,即mon.conf中的</code><code>/data/log/xxx</code><code>.xxx.com</code><code>/access</code><code>.log,執行502.sh腳本</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>

主程式隻添加了502監控,根據需求我們可以在mon.conf和main.sh中按模闆添加監控項目。但是需要将整個告警系統copy過去,保證系統的完整性。

2.  配置檔案   mon.conf

<code>## to config the options if to monitor</code>

<code>## cdb  主要定義mysql的伺服器位址、端口以及user、password</code>

<code>to_mon_cdb=0   </code><code>##0 or 1, default 0,0 not monitor, 1 monitor</code>

<code>cdb_ip=10.20.3.13</code>

<code>cdb_port=3315</code>

<code>cdb_user=username</code>

<code>cdb_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  需要定義通路日志的路徑</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   定義日志路徑以及域名</code>

<code>to_mon_request_count=0</code>

<code>req_log=</code><code>/data/log/www</code><code>.discuz.net</code><code>/access</code><code>.log</code>

<code>domainname=www.discuz.net</code>

mon.conf配置檔案還是很好了解的。

3.  load.sh

<code>#! /bin/bash</code>

<code>##Writen by aming##</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>//load</code><code>是1分鐘負載的整數部分數值</code>

<code>if</code> <code>[ $load -gt 20 ] &amp;&amp; [ $send -</code><code>eq</code> <code>"1"</code> <code>]  </code><code>//</code><code>如果負載大于20(具體看自己系統硬體條件)且開啟發送郵件則将“時間+負載”重定向到load.tmp,執行發送郵件腳本“$1 $2” $3,“$1 $2”是主題,$3是内容,跟mail.sh格式相同</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 $addr\_load $load ..</code><code>/log/load</code><code>.tmp</code>

<code>echo</code> <code>"`date +%T` load is $load"</code>   <code>//</code><code>列印“時間+負載”</code>

4.  502.sh

<code>d=`</code><code>date</code> <code>-d </code><code>"-1 min"</code> <code>+%H:%M`    </code><code>//</code><code>将一分鐘前的時間指派給d</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>//</code><code>過濾統計</code><code>/data/log/xxx</code><code>.xxx.com</code><code>/access</code><code>.log中502的次數</code>

<code>if</code> <code>[ $c_502 -gt 10 ] &amp;&amp; [ $send == 1 ]; </code><code>then</code>      <code>//</code><code>如果502的次數超過10次,即502情況持續了10分鐘,且郵件開,則将“IP+時間+502次數”重定向到502.tmp,發送郵件</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>   <code>//</code><code>列印“時間+502次數”</code>

*擴充disk.sh

<code>rm</code> <code>-f ..</code><code>/log/disk</code><code>.tmp</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>//</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>如果有資料大于90,且郵件開,則将“時間+Use值追加重定向到disk.tmp(遺憾的是不清楚是哪個盤Use大于90)</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>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>

5. mail.php

<code>&lt;?php</code>

<code>class Smtp</code>

<code>{</code>

<code>    </code><code>/* Public Variables */</code>

<code>    </code><code>var $smtp_port;</code>

<code>    </code><code>var $time_out;</code>

<code>    </code><code>var $host_name;</code>

<code>    </code><code>var $log_file;</code>

<code>    </code><code>var $relay_host;</code>

<code>    </code><code>var $debug;</code>

<code>    </code><code>var $auth;</code>

<code>    </code><code>var $user;</code>

<code>    </code><code>var $pass;</code>

<code>    </code><code>/* Private Variables */</code>

<code>    </code><code>var $sock;</code>

<code>    </code><code>/* Constractor */</code>

<code>    </code><code>function</code> <code>Smtp($relay_host = </code><code>""</code><code>, $smtp_port = 25,$auth = </code><code>false</code><code>,$user,$pass)</code>

<code>    </code><code>{</code>

<code>        </code><code>$this-&gt;debug = FALSE;</code>

<code>        </code><code>$this-&gt;smtp_port = $smtp_port;</code>

<code>        </code><code>$this-&gt;relay_host = $relay_host;</code>

<code>        </code><code>$this-&gt;time_out = 30; </code><code>//is</code> <code>used </code><code>in</code> <code>fsockopen()</code>

<code>        </code><code>#</code>

<code>        </code><code>$this-&gt;auth = $auth;</code><code>//auth</code>

<code>        </code><code>$this-&gt;user = $user;</code>

<code>        </code><code>$this-&gt;pass = $pass;</code>

<code>        </code><code>$this-&gt;host_name = </code><code>"localhost"</code><code>; </code><code>//is</code> <code>used </code><code>in</code> <code>HELO </code><code>command</code>

<code>        </code><code>$this-&gt;log_file = </code><code>""</code><code>;</code>

<code>        </code><code>$this-&gt;sock = FALSE;</code>

<code>    </code><code>}</code>

<code>    </code><code>/* Main Function */</code>

<code>    </code><code>function</code> <code>sendmail($to, $from, $subject = </code><code>""</code><code>, $body = </code><code>""</code><code>, $mailtype, $cc = </code><code>""</code><code>, $bcc = </code><code>""</code><code>, $additional_headers = </code><code>""</code><code>)</code>

<code>        </code><code>$mail_from = $this-&gt;get_address($this-&gt;strip_comment($from));</code>

<code>        </code><code>$body = ereg_replace(</code><code>"(^|(\r\n))(\.)"</code><code>, </code><code>"\1.\3"</code><code>, $body);</code>

<code>        </code><code>$header = </code><code>"MIME-Version:1.0\r\n"</code><code>;</code>

<code>        </code><code>if</code><code>($mailtype==</code><code>"HTML"</code><code>){</code>

<code>            </code><code>$header .= </code><code>"Content-Type:text/html\r\n"</code><code>;</code>

<code>        </code><code>}</code>

<code>        </code><code>$header .= </code><code>"To: "</code><code>.$to.</code><code>"\r\n"</code><code>;</code>

<code>        </code><code>if</code> <code>($cc != </code><code>""</code><code>) {</code>

<code>            </code><code>$header .= </code><code>"Cc: "</code><code>.$cc.</code><code>"\r\n"</code><code>;</code>

<code>        </code><code>$header .= </code><code>"From: $from&lt;"</code><code>.$from.</code><code>"&gt;\r\n"</code><code>;</code>

<code>        </code><code>$header .= </code><code>"Subject: "</code><code>.$subject.</code><code>"\r\n"</code><code>;</code>

<code>        </code><code>$header .= $additional_headers;</code>

<code>        </code><code>$header .= </code><code>"Date: "</code><code>.</code><code>date</code><code>(</code><code>"r"</code><code>).</code><code>"\r\n"</code><code>;</code>

<code>        </code><code>$header .= </code><code>"X-Mailer:By Redhat (PHP/"</code><code>.phpversion().</code><code>")\r\n"</code><code>;</code>

<code>        </code><code>list($msec, $sec) = explode(</code><code>" "</code><code>, microtime());</code>

<code>        </code><code>$header .= </code><code>"Message-ID: &lt;"</code><code>.</code><code>date</code><code>(</code><code>"YmdHis"</code><code>, $sec).</code><code>"."</code><code>.($msec*1000000).</code><code>"."</code><code>.$mail_from.</code><code>"&gt;\r\n"</code><code>;</code>

<code>        </code><code>$TO = explode(</code><code>","</code><code>, $this-&gt;strip_comment($to));</code>

<code>            </code><code>$TO = array_merge($TO, explode(</code><code>","</code><code>, $this-&gt;strip_comment($cc)));</code>

<code>        </code><code>if</code> <code>($bcc != </code><code>""</code><code>) {</code>

<code>            </code><code>$TO = array_merge($TO, explode(</code><code>","</code><code>, $this-&gt;strip_comment($bcc)));</code>

<code>        </code><code>$sent = TRUE;</code>

<code>        </code><code>foreach ($TO as $rcpt_to) {</code>

<code>            </code><code>$rcpt_to = $this-&gt;get_address($rcpt_to);</code>

<code>            </code><code>if</code> <code>(!$this-&gt;smtp_sockopen($rcpt_to)) {</code>

<code>                </code><code>$this-&gt;log_write(</code><code>"Error: Cannot send email to "</code><code>.$rcpt_to.</code><code>"\n"</code><code>);</code>

<code>                </code><code>$sent = FALSE;</code>

<code>                </code><code>continue</code><code>;</code>

<code>            </code><code>}</code>

<code>            </code><code>if</code> <code>($this-&gt;smtp_send($this-&gt;host_name, $mail_from, $rcpt_to, $header, $body)) {</code>

<code>                </code><code>$this-&gt;log_write(</code><code>"E-mail has been sent to &lt;"</code><code>.$rcpt_to.</code><code>"&gt;\n"</code><code>);</code>

<code>            </code><code>} </code><code>else</code> <code>{</code>

<code>                </code><code>$this-&gt;log_write(</code><code>"Error: Cannot send email to &lt;"</code><code>.$rcpt_to.</code><code>"&gt;\n"</code><code>);</code>

<code>            </code><code>fclose($this-&gt;sock);</code>

<code>            </code><code>$this-&gt;log_write(</code><code>"Disconnected from remote host\n"</code><code>);</code>

<code>        </code><code>return</code> <code>$sent;</code>

<code>/* Private Functions */</code>

<code>   </code><code>function</code> <code>smtp_send($helo, $from, $to, $header, $body = </code><code>""</code><code>)</code>

<code>        </code><code>if</code> <code>(!$this-&gt;smtp_putcmd(</code><code>"HELO"</code><code>, $helo)) {</code>

<code>            </code><code>return</code> <code>$this-&gt;smtp_error(</code><code>"sending HELO command"</code><code>);</code>

<code>        </code><code>#auth</code>

<code>        </code><code>if</code><code>($this-&gt;auth){</code>

<code>            </code><code>if</code> <code>(!$this-&gt;smtp_putcmd(</code><code>"AUTH LOGIN"</code><code>, base64_encode($this-&gt;user))) {</code>

<code>                </code><code>return</code> <code>$this-&gt;smtp_error(</code><code>"sending HELO command"</code><code>);</code>

<code>            </code><code>if</code> <code>(!$this-&gt;smtp_putcmd(</code><code>""</code><code>, base64_encode($this-&gt;pass))) {</code>

<code>        </code><code>if</code> <code>(!$this-&gt;smtp_putcmd(</code><code>"MAIL"</code><code>, </code><code>"FROM:&lt;"</code><code>.$from.</code><code>"&gt;"</code><code>)) {</code>

<code>            </code><code>return</code> <code>$this-&gt;smtp_error(</code><code>"sending MAIL FROM command"</code><code>);</code>

<code>        </code><code>if</code> <code>(!$this-&gt;smtp_putcmd(</code><code>"RCPT"</code><code>, </code><code>"TO:&lt;"</code><code>.$to.</code><code>"&gt;"</code><code>)) {</code>

<code>            </code><code>return</code> <code>$this-&gt;smtp_error(</code><code>"sending RCPT TO command"</code><code>);</code>

<code>        </code><code>if</code> <code>(!$this-&gt;smtp_putcmd(</code><code>"DATA"</code><code>)) {</code>

<code>            </code><code>return</code> <code>$this-&gt;smtp_error(</code><code>"sending DATA command"</code><code>);</code>

<code>        </code><code>if</code> <code>(!$this-&gt;smtp_message($header, $body)) {</code>

<code>            </code><code>return</code> <code>$this-&gt;smtp_error(</code><code>"sending message"</code><code>);</code>

<code>        </code><code>if</code> <code>(!$this-&gt;smtp_eom()) {</code>

<code>            </code><code>return</code> <code>$this-&gt;smtp_error(</code><code>"sending &lt;CR&gt;&lt;LF&gt;.&lt;CR&gt;&lt;LF&gt; [EOM]"</code><code>);</code>

<code>        </code><code>if</code> <code>(!$this-&gt;smtp_putcmd(</code><code>"QUIT"</code><code>)) {</code>

<code>            </code><code>return</code> <code>$this-&gt;smtp_error(</code><code>"sending QUIT command"</code><code>);</code>

<code>        </code><code>return</code> <code>TRUE;</code>

<code>    </code><code>function</code> <code>smtp_sockopen($address)</code>

<code>        </code><code>if</code> <code>($this-&gt;relay_host == </code><code>""</code><code>) {</code>

<code>            </code><code>return</code> <code>$this-&gt;smtp_sockopen_mx($address);</code>

<code>        </code><code>} </code><code>else</code> <code>{</code>

<code>            </code><code>return</code> <code>$this-&gt;smtp_sockopen_relay();</code>

<code>    </code><code>function</code> <code>smtp_sockopen_relay()</code>

<code>        </code><code>$this-&gt;log_write(</code><code>"Trying to "</code><code>.$this-&gt;relay_host.</code><code>":"</code><code>.$this-&gt;smtp_port.</code><code>"\n"</code><code>);</code>

<code>        </code><code>$this-&gt;sock = @fsockopen($this-&gt;relay_host, $this-&gt;smtp_port, $errno, $errstr, $this-&gt;time_out);</code>

<code>        </code><code>if</code> <code>(!($this-&gt;sock &amp;&amp; $this-&gt;smtp_ok())) {</code>

<code>            </code><code>$this-&gt;log_write(</code><code>"Error: Cannot connenct to relay host "</code><code>.$this-&gt;relay_host.</code><code>"\n"</code><code>);</code>

<code>            </code><code>$this-&gt;log_write(</code><code>"Error: "</code><code>.$errstr.</code><code>" ("</code><code>.$errno.</code><code>")\n"</code><code>);</code>

<code>            </code><code>return</code> <code>FALSE;</code>

<code>        </code><code>$this-&gt;log_write(</code><code>"Connected to relay host "</code><code>.$this-&gt;relay_host.</code><code>"\n"</code><code>);</code>

<code>    </code><code>function</code> <code>smtp_sockopen_mx($address)</code>

<code>        </code><code>$domain = ereg_replace(</code><code>"^.+@([^@]+)$"</code><code>, </code><code>"\1"</code><code>, $address);</code>

<code>        </code><code>if</code> <code>(!@getmxrr($domain, $MXHOSTS)) {</code>

<code>            </code><code>$this-&gt;log_write(</code><code>"Error: Cannot resolve MX \""</code><code>.$domain.</code><code>"\"\n"</code><code>);</code>

<code>        </code><code>foreach ($MXHOSTS as $host) {</code>

<code>            </code><code>$this-&gt;log_write(</code><code>"Trying to "</code><code>.$host.</code><code>":"</code><code>.$this-&gt;smtp_port.</code><code>"\n"</code><code>);</code>

<code>           </code><code>$this-&gt;sock = @fsockopen($host, $this-&gt;smtp_port, $errno, $errstr, $this-&gt;time_out);</code>

<code>            </code><code>if</code> <code>(!($this-&gt;sock &amp;&amp; $this-&gt;smtp_ok())) {</code>

<code>                </code><code>$this-&gt;log_write(</code><code>"Warning: Cannot connect to mx host "</code><code>.$host.</code><code>"\n"</code><code>);</code>

<code>                </code><code>$this-&gt;log_write(</code><code>"Error: "</code><code>.$errstr.</code><code>" ("</code><code>.$errno.</code><code>")\n"</code><code>);</code>

<code>               </code><code>continue</code><code>;</code>

<code>            </code><code>$this-&gt;log_write(</code><code>"Connected to mx host "</code><code>.$host.</code><code>"\n"</code><code>);</code>

<code>            </code><code>return</code> <code>TRUE;</code>

<code>        </code><code>$this-&gt;log_write(</code><code>"Error: Cannot connect to any mx hosts ("</code><code>.implode(</code><code>", "</code><code>, $MXHOSTS).</code><code>")\n"</code><code>);</code>

<code>       </code><code>return</code> <code>FALSE;</code>

<code>    </code><code>function</code> <code>smtp_message($header, $body)</code>

<code>      </code><code>fputs($this-&gt;sock, $header.</code><code>"\r\n"</code><code>.$body);</code>

<code>        </code><code>$this-&gt;smtp_debug(</code><code>"&gt; "</code><code>.str_replace(</code><code>"\r\n"</code><code>, </code><code>"\n"</code><code>.</code><code>"&gt; "</code><code>, $header.</code><code>"\n&gt; "</code><code>.$body.</code><code>"\n&gt; "</code><code>));</code>

<code>    </code><code>function</code> <code>smtp_eom()</code>

<code>   </code><code>{</code>

<code>        </code><code>fputs($this-&gt;sock, </code><code>"\r\n.\r\n"</code><code>);</code>

<code>        </code><code>$this-&gt;smtp_debug(</code><code>". [EOM]\n"</code><code>);</code>

<code>        </code><code>return</code> <code>$this-&gt;smtp_ok();</code>

<code>    </code><code>function</code> <code>smtp_ok()</code>

<code>        </code><code>$response = str_replace(</code><code>"\r\n"</code><code>, </code><code>""</code><code>, fgets($this-&gt;sock, 512));</code>

<code>        </code><code>$this-&gt;smtp_debug($response.</code><code>"\n"</code><code>);</code>

<code>        </code><code>if</code> <code>(!ereg(</code><code>"^[23]"</code><code>, $response)) {</code>

<code>            </code><code>fputs($this-&gt;sock, </code><code>"QUIT\r\n"</code><code>);</code>

<code>            </code><code>fgets($this-&gt;sock, 512);</code>

<code>            </code><code>$this-&gt;log_write(</code><code>"Error: Remote host returned \""</code><code>.$response.</code><code>"\"\n"</code><code>);</code>

<code>    </code><code>function</code> <code>smtp_putcmd($cmd, $arg = </code><code>""</code><code>)</code>

<code>        </code><code>if</code> <code>($arg != </code><code>""</code><code>) {</code>

<code>           </code><code>if</code><code>($cmd==</code><code>""</code><code>) $cmd = $arg;</code>

<code>            </code><code>else</code> <code>$cmd = $cmd.</code><code>" "</code><code>.$arg;</code>

<code>        </code><code>fputs($this-&gt;sock, $cmd.</code><code>"\r\n"</code><code>);</code>

<code>        </code><code>$this-&gt;smtp_debug(</code><code>"&gt; "</code><code>.$cmd.</code><code>"\n"</code><code>);</code>

<code>    </code><code>function</code> <code>smtp_error($string)</code>

<code>        </code><code>$this-&gt;log_write(</code><code>"Error: Error occurred while "</code><code>.$string.</code><code>".\n"</code><code>);</code>

<code>        </code><code>return</code> <code>FALSE;</code>

<code>    </code><code>function</code> <code>log_write($message)</code>

<code>        </code><code>$this-&gt;smtp_debug($message);</code>

<code>        </code><code>if</code> <code>($this-&gt;log_file == </code><code>""</code><code>) {</code>

<code>                </code><code>return</code> <code>TRUE;</code>

<code>        </code><code>$message = </code><code>date</code><code>(</code><code>"M d H:i:s "</code><code>).get_current_user().</code><code>"["</code><code>.getmypid().</code><code>"]: "</code><code>.$message;</code>

<code>        </code><code>if</code> <code>(!@file_exists($this-&gt;log_file) || !($fp = @fopen($this-&gt;log_file, </code><code>"a"</code><code>))) {</code>

<code>            </code><code>$this-&gt;smtp_debug(</code><code>"Warning: Cannot open log file \""</code><code>.$this-&gt;log_file.</code><code>"\"\n"</code><code>);</code>

<code>            </code><code>return</code> <code>FALSE;;</code>

<code>        </code><code>flock($fp, LOCK_EX);</code>

<code>        </code><code>fputs($fp, $message);</code>

<code>        </code><code>fclose($fp);</code>

<code>    </code><code>function</code> <code>strip_comment($address)</code>

<code>        </code><code>$comment = </code><code>"\([^()]*\)"</code><code>;</code>

<code>       </code><code>while</code> <code>(ereg($comment, $address)) {</code>

<code>            </code><code>$address = ereg_replace($comment, </code><code>""</code><code>, $address);</code>

<code>        </code><code>return</code> <code>$address;</code>

<code>    </code><code>function</code> <code>get_address($address)</code>

<code>        </code><code>$address = ereg_replace(</code><code>"([ \t\r\n])+"</code><code>, </code><code>""</code><code>, $address);</code>

<code>        </code><code>$address = ereg_replace(</code><code>"^.*&lt;(.+)&gt;.*$"</code><code>, </code><code>"\1"</code><code>, $address);</code>

<code>    </code><code>function</code> <code>smtp_debug($message)</code>

<code>        </code><code>if</code> <code>($this-&gt;debug) {</code>

<code>        </code><code>echo</code> <code>$message;</code>

<code>}</code>

<code>$</code><code>file</code> <code>= $argv[2];</code>

<code>$smtpserver = </code><code>"smtp.qq.com"</code><code>;</code><code>//SMTP</code><code>伺服器</code>

<code>$smtpserverport = </code><code>"25"</code><code>;</code><code>//SMTP</code><code>伺服器端口</code>

<code>$smtpusermail = </code><code>"[email protected]"</code><code>;</code><code>//SMTP</code><code>伺服器的使用者郵箱</code>

<code>$smtpemailto = </code><code>"[email protected]"</code><code>;</code><code>//</code><code>發送給誰</code>

<code>$smtpuser = </code><code>"1198658"</code><code>;</code><code>//SMTP</code><code>伺服器的使用者帳号</code>

<code>$smtppass = </code><code>"1212lss"</code><code>;</code><code>//SMTP</code><code>伺服器的使用者密碼(這個密碼是郵箱的獨立秘密,而不是郵箱的登陸密碼)</code>

<code>$mailsubject = $argv[1];</code><code>//</code><code>郵件主題</code>

<code>$mailbody = file_get_contents($</code><code>file</code><code>);</code><code>//</code><code>郵件内容</code>

<code>$mailtype = </code><code>"HTML"</code><code>;</code><code>//</code><code>郵件格式(HTML</code><code>/TXT</code><code>),TXT為文本郵件</code>

<code>$smtp = new smtp($smtpserver,$smtpserverport,</code><code>true</code><code>,$smtpuser,$smtppass);</code><code>//</code><code>這裡面的一個</code><code>true</code><code>是表示使用身份驗證,否則不使用身份驗證.</code>

<code>//</code><code>$smtp-&gt;debug = TRUE;</code><code>//</code><code>是否顯示發送的調試資訊</code>

<code>$smtp-&gt;sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);</code>

<code>?&gt;</code>

好吧,不懂php,隻能将下面的參數理一理。

要想發郵件的話,首先要有php支援,若你沒有安裝過lamp或者lnmp,則需要運作yum install -y php 安裝。

然後運作  php  mail.php  "郵箱主題寫在這裡" "/tmp/test.txt"   。其中,/tmp/test.txt 内容為郵件内容。

6. mail.sh

<code>   </code> 

<code>    </code><code>log=$1  </code><code>//</code><code>$1是發送郵件時的$1,比如502.sh中的$addr\_502</code>

<code>    </code><code>t_s=`</code><code>date</code> <code>+%s`  </code><code>//</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>記錄2個小時之前的時間</code>

<code>    </code><code>if</code> <code>[ ! -f </code><code>/tmp/</code><code>$log ]   </code><code>//</code><code>如果檔案不存在,則将2個小時之前的時間重定向到這個檔案</code>

<code>    </code><code>then</code>

<code>        </code><code>echo</code> <code>$t_s2 &gt; </code><code>/tmp/</code><code>$log</code>

<code>    </code><code>fi</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>如果檔案存在,将這個檔案最後一個時間指派給ts_2</code>

<code>    </code><code>echo</code> <code>$t_s&gt;&gt;</code><code>/tmp/</code><code>$log </code><code>//</code><code>将目前時間追加重定向到這個檔案中</code>

<code>    </code><code>v</code><code>=$[$t_s-$t_s2]         </code><code>//</code><code>記錄倆次時間的間隔</code>

<code>        </code><code>echo</code> <code>$</code><code>v</code>

<code>    </code><code>if</code> <code>[ $</code><code>v</code> <code>-gt 3600 ]</code><code>//</code><code>第一次執行這個腳本時,因為</code><code>/tmp/</code><code>$log的最後一個時間是2個小時之前,相當于7200,肯定是大于3600的,是以會先發送一份郵件;但如果後面一直報警(要注意的是我們在</code><code>crontab</code><code>任務計劃中是1分鐘執行一次main.sh),$</code><code>v</code><code>會小于3600也就是1小時,則腳本會不發送郵件,而對$log.txt裡的數值從0進行累加,直到大于10,再發送一封郵件,并重新将0重定向到$log.txt,等待下一輪10</code>

<code>    </code><code>then</code>    

<code>        </code><code>/dir/to/php</code> <code>..</code><code>/mail/mail</code><code>.php </code><code>"$1 $2"</code> <code>"$3"</code>

<code>        </code><code>echo</code> <code>"0"</code> <code>&gt; </code><code>/tmp/</code><code>$log.txt</code>

<code>    </code><code>else</code>    

<code>        </code><code>if</code> <code>[ ! -f </code><code>/tmp/</code><code>$log.txt ]</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>fi</code>

<code>        </code><code>nu=`</code><code>cat</code> <code>/tmp/</code><code>$log.txt`</code>

<code>        </code><code>nu2=$[$nu+1]</code>

<code>        </code><code>echo</code> <code>$nu2&gt;</code><code>/tmp/</code><code>$log.txt</code>

<code>        </code><code>if</code> <code>[ $nu2 -gt 10 ]</code>

<code>        </code><code>then</code>    

<code>            </code><code>/dir/to/php</code> <code>..</code><code>/mail/mail</code><code>.php </code><code>"trouble continue 10 min $1  $2 "</code> <code>"$3"</code>

<code>             </code><code>echo</code> <code>"0"</code> <code>&gt; </code><code>/tmp/</code><code>$log.txt</code>

<code>        </code><code>fi</code>      

這是本人對告警系統的了解,若有不對的地方,望提出改正,謝謝!

      本文轉自YU文武貝 51CTO部落格,原文連結:http://blog.51cto.com/linuxerxy/1725290,如需轉載請自行聯系原作者