제3 2 일: 셸 프로 그래 밍 경고 시스템

18978 단어 linux
작은 Q: 물 한 방울 은 바다 에 넣 어야 마 르 지 않 는 다. 한 사람 은 자신 과 사업 을 융합 시 켜 야 한다.
      때 가 가장 힘 이 있다.                                 --- 뇌봉
머리말
운영 과정: 주로 우리 의 서버 를 감시 하고 발생 하 는 고장 을 제때에 해결 하기 때문에 그 에 게 메 일 을 보 낼 수 있 거나
문자 메시지 의 경고 시스템 은 없어 서 는 안 된다.앞에서 우 리 는 자신의 메 일 서버 를 맞 춤 형 으로 만 들 었 고 제3자 도 맞 춤 형 으로 사용 한 적 이 있다.
의 모니터링 소프트웨어 는 자신의 메 일이 나 문자 경보 방법 을 실현 한다.
그러나 때때로 우 리 는 자신 만 의 경고 시스템 을 맞 추고 목적 성 이 강하 고 보장 이 있어 야 한다.
우 리 는 배 운 셸 을 사용 하여 서로 다른 수 요 를 위해 각종 개성 화 된 경고 도 구 를 맞 추고 관 리 를 통일 시 킬 수 있다.
다음은 대체적인 모델 일 뿐 구체 적 인 내용 은 우리 의 실제 업무 환경 과 우리 의 수 요 를 겨냥 해 야 한다
변경 하 는 것 이 고 우리 가 현재 가장 중요 한 것 은 그의 사고 와 체 계 를 이해 하 는 것 이다.
시스템 구조
1. 사고방식: 메 인 프로그램, 서브루틴, 프로필, 메 일 엔진, 출력 로그 등 파일 을 포함 하 는 스 크 립 트 패 키 지 를 지정 합 니 다.
주 프로그램: 전체 스 크 립 트 시스템 의 입 구 는 전체 시스템 의 명맥 입 니 다. 이 를 실행 하면 온몸 을 움 직 입 니 다.
설정 파일: 제어 센터 입 니 다. 각 서브루틴 을 끄 고 연 결 된 로그 파일 을 지정 합 니 다.
서브루틴: 각종 수요 모니터링 스 크 립 트 를 저장 하 는 것 은 시스템 의 핵심 기구 입 니 다.
메 일 엔진: phop 프로그램 으로 이 루어 집 니 다. 메 일 을 보 내 는 서버, 메 일 을 보 내 는 사람, 메 일 을 받 는 사람 을 정의 합 니 다.
출력 로그: 전체 모니터링 시스템 에 로그 출력 이 있어 야 합 니 다.
2. 시스템:
                                    (홈 디 렉 터 리 mon)
      _____________________________________|_____________________________________________
      |          |              |                  |                   |             |                             
     bin        conf          shares              mail                log          .....
      |          |              |                  |                   |             |
      |          |              |                  |                   |             |
 [main.sh]  [ mon.conf] [load.sh 502.sh]  [mail.php mail.sh]  [ mon.log  err.log] [......]
bin  :메 인 프로그램 이 끝나 면 그 를 임무 계획 에 넣 으 면 된다.
conf: 메 인 프로필 은 다른 응용 프로그램 과 마찬가지 로 중요 합 니 다.
mail: 메 일 엔진, php 는 주로 메 일 서버, 메 일 발송 및 수신 자, sh 를 실현 합 니 다.
log  :로그, poli 시스템 로그, err 시스템 오류 로그;
shares: 각 모니터링 스 크 립 트, load 모니터링 부하, 502 모니터링 http 502 상태;
...: 당신 의 요구 에 따라 기능 을 만 드 는 디 렉 터 리 를 추가 하고 모니터링 서비스 만 추가 하면 shares 에 가입 하면 됩 니 다.
3: 시스템 스 크 립 트 템 플 릿
수요: 서버 부하 와 사이트 에 발생 하 는 502 오 류 를 감시 하고 제 qq 메 일 로 메 일 을 보 냅 니 다.
1. main.sh
#!/bin/bash
#    ,copy by aming;

export send=1           #          ,1  ;export    ,         

export addr=`/sbin/ifconfig |grep -A1 'eth0' |grep addr: |awk '{print $2}'|awk -F: '{print $2}'`                 #   ip  ,        ,         

dir=`pwd`
last_dir=`echo $dir|awk -F'/' '{print $NF}'`    #         ,        

#      :         ,   bin   ,      、          
if [ $last_dir == "bin" ] || [ $last_dir == "bin/" ]; then
    conf_file="../conf/mon.conf"                #    ,       
else
    echo "you shoud cd bin dir"                  #   ,         
    exit
fi
exec 1>>../log/mon.log 2>>../log/err.log      #      ,            log
echo "`date +"%F %T"` load average"           #         ,         
/bin/bash  ../shares/load.sh                  #        

#              502
if grep -q 'to_mon_502=1' $conf_file; then
    export log=`grep 'logfile=' $conf_file |awk -F '=' '{print $2}' |sed 's/ //g'`
    /bin/bash   ../shares/502.sh             #    ,  502  
fi

2.  mon.conf
## to config the options if to monitor
## cdb     mysql      、    user、password
to_mon_cdb=0                      ##0 or 1, default 0,0 not monitor, 1 monitor  
cdb_ip=10.20.3.13                 ##        IP
cdb_port=3315
cdb_user=username
cdb_pass=passwd

to_mon_httpd=0                      ## httpd      1   , 0   

to_mon_php_socket=0                 ## php    1   , 0   

to_mon_502=1                        ## http_code_502             
logfile=/data/log/xxx.xxx.com/access.log         
## request_count             
to_mon_request_count=0                     ##     
req_log=/data/log/       ## discuz    ,  log  
domainname=                         ##      

3. load.sh
#! /bin/bash
##      ##
----------------------------------------    --------------------------------------
load=`uptime |awk -F 'average:' '{print $2}'|cut -d',' -f1|sed 's/ //g' |cut -d. -f1`
                              ##     w       avreage     
if [ $load -gt 20 ] && [ $send -eq "1" ]    ##  load    ,send        
then
    echo "$addr `date +%T` load is $load" >../log/load.tmp   ##       load.tmp
    /bin/bash ../mail/mail.sh $addr\_load $load ../log/load.tmp
fi                                         ##      ,       $1 $2 $3
echo "`date +%T` load is $load"            ##          ,      

4. 502.sh
#! /bin/bash
##     ##

d=`date -d "-1 min" +%H:%M`                     ##  d   
c_502=`grep :$d:  $log  |grep ' 502 '|wc -l`         
if [ $c_502 -gt 10 ] && [ $send == 1 ]; then    ##  502      ,  send   
     echo "$addr $d 502 count is $c_502">../log/502.tmp   ##     502.tmp
     /bin/bash ../mail/mail.sh $addr\_502 $c_502  ../log/502.tmp   
fi                                             ##      ,      $1 $2 $3
echo "`date +%T` 502 $c_502"                   ##  502    ,   

추가: disk. sh
#! /bin/bash
##Writen by aming##
---------------------------------        --------------------------------------
rm -f ../log/disk.tmp                        ##    disk   
for r in `df -h |awk -F '[ %]+' '{print $5}'|grep -v Use` #       
do
    if [ $r -gt 90 ] && [ $send -eq "1" ]                ##    r       
then
    echo "$addr `date +%T` disk useage is $r" >>../log/disk.tmp   #  disk.tmp  
fi
if [ -f ../log/disk.tmp ]                             #       ,      90 
then
    df -h >> ../log/disk.tmp                         #                       
    /bin/bash ../mail/mail.sh $addr\_disk $r ../log/disk.tmp  
    echo "`date +%T` disk useage is nook"            ##    ,     
else
    echo "`date +%T` disk useage is ok"              ##       ,    ok 
fi

5. mail. php: 사실 많은 내용 이 우리 에 게 쓸모 가 없습니다. php 를 잘 모 르 기 때문에 잘못 삭제 한 후에 필요 한 내용 을 초래 할 까 봐 걱정 입 니 다.
                 문제 가 생기 면 그대로 복사 하고 맨 밑 에 소개 하 는 내용 을 주로 사용 합 니 다.
<?php
class Smtp
{
    /* Public Variables */
    var $smtp_port;
    var $time_out;
    var $host_name;
    var $log_file;
    var $relay_host;
    var $debug;
    var $auth;
    var $user;
    var $pass;
    /* Private Variables */
    var $sock;
    /* Constractor */
    function Smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)
    {
        $this->debug = FALSE;
        $this->smtp_port = $smtp_port;
        $this->relay_host = $relay_host;
        $this->time_out = 30; //is used in fsockopen()
        #
        $this->auth = $auth;//auth
        $this->user = $user;
        $this->pass = $pass;
        #
        $this->host_name = "localhost"; //is used in HELO command
        $this->log_file = "";
        $this->sock = FALSE;
    }
    /* Main Function */
    function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
    {
        $mail_from = $this->get_address($this->strip_comment($from));
        $body = ereg_replace("(^|(\r
))(\.)", "\1.\3", $body);         $header = "MIME-Version:1.0\r
";         if($mailtype=="HTML"){             $header .= "Content-Type:text/html\r
";         }         $header .= "To: ".$to."\r
";         if ($cc != "") {             $header .= "Cc: ".$cc."\r
";         }         $header .= "From: $from<".$from.">\r
";         $header .= "Subject: ".$subject."\r
";         $header .= $additional_headers;         $header .= "Date: ".date("r")."\r
";         $header .= "X-Mailer:By Redhat (PHP/".phpversion().")\r
";         list($msec, $sec) = explode(" ", microtime());         $header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">\r
";         $TO = explode(",", $this->strip_comment($to));         if ($cc != "") {             $TO = array_merge($TO, explode(",", $this->strip_comment($cc)));         }         if ($bcc != "") {             $TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));         }         $sent = TRUE;         foreach ($TO as $rcpt_to) {             $rcpt_to = $this->get_address($rcpt_to);             if (!$this->smtp_sockopen($rcpt_to)) {                 $this->log_write("Error: Cannot send email to ".$rcpt_to."
");                 $sent = FALSE;                 continue;             }             if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {                 $this->log_write("E-mail has been sent to <".$rcpt_to.">
");             } else {                 $this->log_write("Error: Cannot send email to <".$rcpt_to.">
");                 $sent = FALSE;             }             fclose($this->sock);             $this->log_write("Disconnected from remote host
");         }         return $sent;     } /* Private Functions */    function smtp_send($helo, $from, $to, $header, $body = "")     {         if (!$this->smtp_putcmd("HELO", $helo)) {             return $this->smtp_error("sending HELO command");         }         #auth         if($this->auth){             if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {                 return $this->smtp_error("sending HELO command");             }             if (!$this->smtp_putcmd("", base64_encode($this->pass))) {                 return $this->smtp_error("sending HELO command");             }         }         #         if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">")) {             return $this->smtp_error("sending MAIL FROM command");         }         if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">")) {             return $this->smtp_error("sending RCPT TO command");         }         if (!$this->smtp_putcmd("DATA")) {             return $this->smtp_error("sending DATA command");         }         if (!$this->smtp_message($header, $body)) {             return $this->smtp_error("sending message");         }         if (!$this->smtp_eom()) {             return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");         }         if (!$this->smtp_putcmd("QUIT")) {             return $this->smtp_error("sending QUIT command");         }         return TRUE;     }     function smtp_sockopen($address)     {         if ($this->relay_host == "") {             return $this->smtp_sockopen_mx($address);         } else {             return $this->smtp_sockopen_relay();         }     }     function smtp_sockopen_relay()     {         $this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."
");         $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);         if (!($this->sock && $this->smtp_ok())) {             $this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."
");             $this->log_write("Error: ".$errstr." (".$errno.")
");             return FALSE;         }         $this->log_write("Connected to relay host ".$this->relay_host."
");         return TRUE;     }     function smtp_sockopen_mx($address)     {         $domain = ereg_replace("^.+@([^@]+)$", "\1", $address);         if (!@getmxrr($domain, $MXHOSTS)) {             $this->log_write("Error: Cannot resolve MX \"".$domain."\"
");             return FALSE;         }         foreach ($MXHOSTS as $host) {             $this->log_write("Trying to ".$host.":".$this->smtp_port."
");            $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);             if (!($this->sock && $this->smtp_ok())) {                 $this->log_write("Warning: Cannot connect to mx host ".$host."
");                 $this->log_write("Error: ".$errstr." (".$errno.")
");                continue;             }             $this->log_write("Connected to mx host ".$host."
");             return TRUE;         }         $this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")
");        return FALSE;     }     function smtp_message($header, $body)     {       fputs($this->sock, $header."\r
".$body);         $this->smtp_debug("> ".str_replace("\r
", "
"."> ", $header."
> ".$body."
> "));         return TRUE;     }     function smtp_eom()    {         fputs($this->sock, "\r
.\r
");         $this->smtp_debug(". [EOM]
");         return $this->smtp_ok();     }     function smtp_ok()    {         $response = str_replace("\r
", "", fgets($this->sock, 512));         $this->smtp_debug($response."
");         if (!ereg("^[23]", $response)) {             fputs($this->sock, "QUIT\r
");             fgets($this->sock, 512);             $this->log_write("Error: Remote host returned \"".$response."\"
");             return FALSE;         }         return TRUE;     }     function smtp_putcmd($cmd, $arg = "")     {         if ($arg != "") {            if($cmd=="") $cmd = $arg;             else $cmd = $cmd." ".$arg;         }         fputs($this->sock, $cmd."\r
");         $this->smtp_debug("> ".$cmd."
");         return $this->smtp_ok();     }     function smtp_error($string)     {         $this->log_write("Error: Error occurred while ".$string.".
");         return FALSE;     }     function log_write($message)     {         $this->smtp_debug($message);         if ($this->log_file == "") {                 return TRUE;         }         $message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;         if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {             $this->smtp_debug("Warning: Cannot open log file \"".$this->log_file."\"
");             return FALSE;;         }         flock($fp, LOCK_EX);         fputs($fp, $message);         fclose($fp);         return TRUE;     }     function strip_comment($address)    {         $comment = "\([^()]*\)";        while (ereg($comment, $address)) {             $address = ereg_replace($comment, "", $address);         }         return $address;     }     function get_address($address)     {         $address = ereg_replace("([ \t\r
])+", "", $address);         $address = ereg_replace("^.*<(.+)>.*$", "\1", $address);         return $address;     }     function smtp_debug($message)     {         if ($this->debug) {         echo $message;         }     } } $file = $argv[2]; $smtpserver = "smtp.qq.com";       //SMTP , qq , $smtpserverport = "25";            //SMTP $smtpusermail = "[email protected]";  //SMTP , $smtpemailto = "[email protected]";    // $smtpuser = "1193443";             //SMTP $smtppass = "1212lss";             //SMTP , SMTP $mailsubject = $argv[1];           // $mailbody = file_get_contents($file);       // $mailtype = "HTML";                // (HTML/TXT),TXT $smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);                                 // true , . //$smtp->debug = TRUE;          // $smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype); ?>

메 일 을 보 내 려 면 먼저 phop 지원 이 있어 야 합 니 다. lamp 이나 lnmp 를 설치 하지 않 았 다 면 yum install 을 실행 해 야 합 니 다. php 설치;
그리고 실행 방법: php mail.php  "메 일 테마""/tmp/test. txt"  ;
그 중에서/tmp/test. txt 내용 은 메 일 내용 입 니 다.
메 일 테마: 아래 파일 을 가리 키 는 php $1 $2
메 일 내용: 아래 파일 을 가리 키 는 php $3
qq 메 일 서비스 열기: 발송 자로 정의 할 qq 메 일 에 들 어가 서 설정 에서 서 비 스 를 찾 은 다음 모두 엽 니 다. 가장 중요 한 것 은 SMTP 입 니 다.
                그리고 당신 의 독립 비밀 번 호 를 설정 하면 OK 입 니 다.
6.mail.sh
    log=$1                              #$1          $addr\_502 $addr\_load
    t_s=`date +%s`                      #        
    t_s2=`date -d "2 hours ago" +%s`    #            
    if [ ! -f /tmp/$log ]               #  $log    
    then
        echo $t_s2 > /tmp/$log         #     $log, $[$addr\_502]
    fi
    t_s2=`tail -1 /tmp/$log|awk '{print $1}'`   #        
    echo $t_s>>/tmp/$log                        #      $log   
    v=$[$t_s-$t_s2]                             #    ,      
        echo $v                                 #  
    if [ $v -gt 3600 ]                          #    3600 
    then    
        /dir/to/php ../mail/mail.php "$1 $2" "$3"  #  $123  php       
        echo "0" > /tmp/$log.txt                  ##      ,      
    else    
        if [ ! -f /tmp/$log.txt ]               #          
        then
            echo "0" > /tmp/$log.txt            #    ,  0
        fi
        nu=`cat /tmp/$log.txt`                  #    ,   ,   0
        nu2=$[$nu+1]                            # 1
        echo $nu2>/tmp/$log.txt                 #         
        if [ $nu2 -gt 10 ]                      #     10 
        then    
            /dir/to/php ../mail/mail.php "trouble continue 10 min $1  $2 " "$3"
             echo "0" > /tmp/$log.txt      ##    php        
        fi                                 ##    ;     10        ,
    fi                                      #    9  ,       ,   

좋은 웹페이지 즐겨찾기