本人附注对本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>>..</code><code>/log/mon</code><code>.log 2>>..</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 ] && [ $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>>..</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 ] && [ $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>>..</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 ] && [ $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>>>..</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 >> ..</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><?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->debug = FALSE;</code>
<code> </code><code>$this->smtp_port = $smtp_port;</code>
<code> </code><code>$this->relay_host = $relay_host;</code>
<code> </code><code>$this->time_out = 30; </code><code>//is</code> <code>used </code><code>in</code> <code>fsockopen()</code>
<code> </code><code>#</code>
<code> </code><code>$this->auth = $auth;</code><code>//auth</code>
<code> </code><code>$this->user = $user;</code>
<code> </code><code>$this->pass = $pass;</code>
<code> </code><code>$this->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->log_file = </code><code>""</code><code>;</code>
<code> </code><code>$this->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->get_address($this->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<"</code><code>.$from.</code><code>">\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: <"</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>">\r\n"</code><code>;</code>
<code> </code><code>$TO = explode(</code><code>","</code><code>, $this->strip_comment($to));</code>
<code> </code><code>$TO = array_merge($TO, explode(</code><code>","</code><code>, $this->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->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->get_address($rcpt_to);</code>
<code> </code><code>if</code> <code>(!$this->smtp_sockopen($rcpt_to)) {</code>
<code> </code><code>$this->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->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {</code>
<code> </code><code>$this->log_write(</code><code>"E-mail has been sent to <"</code><code>.$rcpt_to.</code><code>">\n"</code><code>);</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>$this->log_write(</code><code>"Error: Cannot send email to <"</code><code>.$rcpt_to.</code><code>">\n"</code><code>);</code>
<code> </code><code>fclose($this->sock);</code>
<code> </code><code>$this->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->smtp_putcmd(</code><code>"HELO"</code><code>, $helo)) {</code>
<code> </code><code>return</code> <code>$this->smtp_error(</code><code>"sending HELO command"</code><code>);</code>
<code> </code><code>#auth</code>
<code> </code><code>if</code><code>($this->auth){</code>
<code> </code><code>if</code> <code>(!$this->smtp_putcmd(</code><code>"AUTH LOGIN"</code><code>, base64_encode($this->user))) {</code>
<code> </code><code>return</code> <code>$this->smtp_error(</code><code>"sending HELO command"</code><code>);</code>
<code> </code><code>if</code> <code>(!$this->smtp_putcmd(</code><code>""</code><code>, base64_encode($this->pass))) {</code>
<code> </code><code>if</code> <code>(!$this->smtp_putcmd(</code><code>"MAIL"</code><code>, </code><code>"FROM:<"</code><code>.$from.</code><code>">"</code><code>)) {</code>
<code> </code><code>return</code> <code>$this->smtp_error(</code><code>"sending MAIL FROM command"</code><code>);</code>
<code> </code><code>if</code> <code>(!$this->smtp_putcmd(</code><code>"RCPT"</code><code>, </code><code>"TO:<"</code><code>.$to.</code><code>">"</code><code>)) {</code>
<code> </code><code>return</code> <code>$this->smtp_error(</code><code>"sending RCPT TO command"</code><code>);</code>
<code> </code><code>if</code> <code>(!$this->smtp_putcmd(</code><code>"DATA"</code><code>)) {</code>
<code> </code><code>return</code> <code>$this->smtp_error(</code><code>"sending DATA command"</code><code>);</code>
<code> </code><code>if</code> <code>(!$this->smtp_message($header, $body)) {</code>
<code> </code><code>return</code> <code>$this->smtp_error(</code><code>"sending message"</code><code>);</code>
<code> </code><code>if</code> <code>(!$this->smtp_eom()) {</code>
<code> </code><code>return</code> <code>$this->smtp_error(</code><code>"sending <CR><LF>.<CR><LF> [EOM]"</code><code>);</code>
<code> </code><code>if</code> <code>(!$this->smtp_putcmd(</code><code>"QUIT"</code><code>)) {</code>
<code> </code><code>return</code> <code>$this->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->relay_host == </code><code>""</code><code>) {</code>
<code> </code><code>return</code> <code>$this->smtp_sockopen_mx($address);</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>return</code> <code>$this->smtp_sockopen_relay();</code>
<code> </code><code>function</code> <code>smtp_sockopen_relay()</code>
<code> </code><code>$this->log_write(</code><code>"Trying to "</code><code>.$this->relay_host.</code><code>":"</code><code>.$this->smtp_port.</code><code>"\n"</code><code>);</code>
<code> </code><code>$this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);</code>
<code> </code><code>if</code> <code>(!($this->sock && $this->smtp_ok())) {</code>
<code> </code><code>$this->log_write(</code><code>"Error: Cannot connenct to relay host "</code><code>.$this->relay_host.</code><code>"\n"</code><code>);</code>
<code> </code><code>$this->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->log_write(</code><code>"Connected to relay host "</code><code>.$this->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->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->log_write(</code><code>"Trying to "</code><code>.$host.</code><code>":"</code><code>.$this->smtp_port.</code><code>"\n"</code><code>);</code>
<code> </code><code>$this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);</code>
<code> </code><code>if</code> <code>(!($this->sock && $this->smtp_ok())) {</code>
<code> </code><code>$this->log_write(</code><code>"Warning: Cannot connect to mx host "</code><code>.$host.</code><code>"\n"</code><code>);</code>
<code> </code><code>$this->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->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->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->sock, $header.</code><code>"\r\n"</code><code>.$body);</code>
<code> </code><code>$this->smtp_debug(</code><code>"> "</code><code>.str_replace(</code><code>"\r\n"</code><code>, </code><code>"\n"</code><code>.</code><code>"> "</code><code>, $header.</code><code>"\n> "</code><code>.$body.</code><code>"\n> "</code><code>));</code>
<code> </code><code>function</code> <code>smtp_eom()</code>
<code> </code><code>{</code>
<code> </code><code>fputs($this->sock, </code><code>"\r\n.\r\n"</code><code>);</code>
<code> </code><code>$this->smtp_debug(</code><code>". [EOM]\n"</code><code>);</code>
<code> </code><code>return</code> <code>$this->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->sock, 512));</code>
<code> </code><code>$this->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->sock, </code><code>"QUIT\r\n"</code><code>);</code>
<code> </code><code>fgets($this->sock, 512);</code>
<code> </code><code>$this->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->sock, $cmd.</code><code>"\r\n"</code><code>);</code>
<code> </code><code>$this->smtp_debug(</code><code>"> "</code><code>.$cmd.</code><code>"\n"</code><code>);</code>
<code> </code><code>function</code> <code>smtp_error($string)</code>
<code> </code><code>$this->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->smtp_debug($message);</code>
<code> </code><code>if</code> <code>($this->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->log_file) || !($fp = @fopen($this->log_file, </code><code>"a"</code><code>))) {</code>
<code> </code><code>$this->smtp_debug(</code><code>"Warning: Cannot open log file \""</code><code>.$this->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>"^.*<(.+)>.*$"</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->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->debug = TRUE;</code><code>//</code><code>是否显示发送的调试信息</code>
<code>$smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);</code>
<code>?></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 > </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>></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>> </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>> </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></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>> </code><code>/tmp/</code><code>$log.txt</code>
<code> </code><code>fi</code>
这是本人对告警系统的理解,若有不对的地方,望提出改正,谢谢!
本文转自YU文武貝 51CTO博客,原文链接:http://blog.51cto.com/linuxerxy/1725290,如需转载请自行联系原作者