shell编程(五)

shell编程(五)

evobot 833 2018-07-16

本文详细列出监控系统的主脚本内容和配置文件的写法,以及监控系统负载,web请求502和磁盘空间三种监控脚本。


告警系统主脚本

  • /usr/local/sbin/下创建mon目录,作为监控系统脚本的根目录;

  • mon目录下创建binconfshareslogmail目录;

  • bin目录下创建main.sh文件,写入一下脚本内容:

    #!/bin/bash
    
    # 是否发送文件
    export send=1
    # 过滤ip地址
    export addr=`/sbin/ifconfig | grep -A1 'eth0' | grep inet | awk '{print$2}'`
    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 should cd bin dir"
        exit
    fi
    
    exec 1>>../log/mon.log 2>>../log/err.log
    echo "`date +"%F %T"` load_average"
    /bin/bash ../shares/load.sh
    
    # 检查配置文件中是否需要监控nginx的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
    fi
    
    
    • export定义的变量在所有的子脚本中都可以使用。

告警系统配置文件

  • 配置文件用来配置对应功能的开关,或者MySQL的ip、port、user/passwd等等;

  • conf目录内,创建mon.conf文件,写入以下内容:

    ## to config the options if to monitor
    ## 定义MySQL的服务器地址、端口以及user、password
    to_mon_cdb=0 ## 0 or 1,default 0,0 not monitor, 1 monitor
    db_ip=10.20.3.13
    db_port=3315
    db_user=username
    db_pass=passwd
    
    ## httpd 1则监控,0则不监控
    to_mon_httpd=0
    
    ## php monitor
    to_mon_php_socket=0
    
    ## http_code_502 需要定义访问日志路径
    to_mon_502=1
    logfile=/data/log/xxx.com/access.log
    
    ## request_count 定义日志路径及域名
    to_mon_request_count=0
    req_log=/data/log/www.discuz.net/access.log
    # 需要获取请求数的域名
    domainname=www.discuz.net
    
    

告警系统监控项目

  • 首先定义监控系统负载的脚本,在shares目录下,创建load.sh文件,写入以下内容:

    #!/bin/bash
    
    load=`uptime | awk -F 'average:' '{print $2}' | cut -d',' -f1 | sed 's/ //g' | cut -d'.' -f1'
    
    if [ $load -gt 10 ] && [ $send -eq "1" ]; then
        echo "$addr `date +%T` load is $load" > ../log/load.tmp
        /bin/bash ../mail/mail.sh $addr\_load $load ../log/load.tmp
    fi
    echo "`date +%T` load is $load"
    
    
  • 继续创建502.sh文件,写入以下内容:

    #!/bin/bash
    
    d=`date -d "-1 min" +%H:%M`
    c_502=`grep :$d: $log |grep ' 502 ' | wc -l`
    
    if [ $c_502 -gt 10 ] && [ $send == 1 ]; then
        echo "$addr $d 502 count is $c_502" > ../log/502.tmp
        /bin/bash ../mail/mail.sh $addr\_502 $c_502 ../log/502.tmp
    fi
    
    echo "`date +%T` 502 $c_502"
    
    
  • 增加监控磁盘使用率的监控脚本,创建disk.sh文件,写入以下内容:

    #!/bin/bash
    
    rm -f ../log/disk.tmp
    LANG=en_US
    # awk可以指定多个分隔符,这里指定空格和%为分隔符,从而去掉df -h中的%
    for r in `df -h | awk -F '[ %]+' '{print $5}' | grep -v Use`; do
        if [ $r -gt 90 ] && [ $send -eq "1" ]; then
            echo "$addr `date +%T` disk useage is $r" >> ../log/disk.tmp
        fi
    
        if [ -f ../log/disk.tmp ]; then
            df -h >> ../log/disk.tmp
            /bin/bash ../mail/mail.sh $addr\_disk $r ../log/disk.tmp
            echo "`date +%T` disk useage is no ok"
        else
            echo "`date +%T` disk useage is ok"
        fi
    done
    
    


# Shell