• shell 监控cpu,memory,load average


    shell 监控cpu,memory,load average,记录到log,当负载压力时,发电邮通知管理员。

    原理:

    1.获取cpu,memory,load average的数值

    2.判断数值是否超过自定义的范围,例如(CPU>90%,Memory<10%,load average>2)

    3.如数值超过范围,发送电邮通知管理员。发送有时间间隔,每小时只会发送一次。

    4.将数值写入log。

    5.设置crontab 每30秒运行一次。


    ServerMonitor.sh

    #!/bin/bash
    
    # 系统监控,记录cpu、memory、load average,当超过规定数值时发电邮通知管理员
    
    # *** config start ***
    
    # 当前目录路径
    ROOT=$(cd "$(dirname "$0")"; pwd)
    
    # 当前服务器名
    HOST=$(hostname)
    
    # log 文件路径
    CPU_LOG="${ROOT}/logs/cpu.log"
    MEM_LOG="${ROOT}/logs/mem.log"
    LOAD_LOG="${ROOT}/logs/load.log"
    
    # 通知电邮列表
    NOTICE_EMAIL='admin@admin.com'
    
    # cpu,memory,load average 记录上一次发送通知电邮时间
    CPU_REMARK='/tmp/servermonitor_cpu.remark'
    MEM_REMARK='/tmp/servermonitor_mem.remark'
    LOAD_REMARK='/tmp/servermonitor_loadaverage.remark'
    
    # 发通知电邮间隔时间
    REMARK_EXPIRE=3600
    NOW=$(date +%s)
    
    # *** config end ***
    
    
    # *** function start ***
    
    # 获取CPU占用
    function GetCpu() {
        cpufree=$(vmstat 1 5 |sed -n '3,$p' |awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}')
        cpuused=$((100 - $cpufree))
        echo $cpuused
    
        local remark
        remark=$(GetRemark ${CPU_REMARK})
    
        # 检查CPU占用是否超过90%
        if [ "$remark" = "" ] && [ "$cpuused" -gt 90 ]; then
            echo "Subject: ${HOST} CPU uses more than 90% $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
            echo "$(date +%s)" > "$CPU_REMARK"
        fi
    }
    
    # 获取内存使用情况
    function GetMem() {
        mem=$(free -m | sed -n '3,3p')
        used=$(echo $mem | awk -F ' ' '{print $3}')
        free=$(echo $mem | awk -F ' ' '{print $4}')
        total=$(($used + $free))
        limit=$(($total/10))
        echo "${total} ${used} ${free}"
    
        local remark
        remark=$(GetRemark ${MEM_REMARK})
    
        # 检查内存占用是否超过90%
        if [ "$remark" = "" ] && [ "$limit" -gt "$free" ]; then
            echo "Subject: ${HOST} Memory uses more than 90% $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
            echo "$(date +%s)" > "$MEM_REMARK"
        fi
    }
    
    # 获取load average
    function GetLoad() {
        load=$(uptime | awk -F 'load average: ' '{print $2}')
        m1=$(echo $load | awk -F ', ' '{print $1}')
        m5=$(echo $load | awk -F ', ' '{print $2}')
        m15=$(echo $load | awk -F ', ' '{print $3}')
        echo "${m1} ${m5} ${m15}"
    
        m1u=$(echo $m1 | awk -F '.' '{print $1}')
    
        local remark
        remark=$(GetRemark ${LOAD_REMARK})
    
        # 检查是否负载是否有压力
        if [ "$remark" = "" ] && [ "$m1u" -gt "2" ]; then
            echo "Subject: ${HOST} Load Average more than 2 $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
            echo "$(date +%s)" > "$LOAD_REMARK"
        fi
    }
    
    # 获取上一次发送电邮时间
    function GetRemark() {
        local remark
    
        if [ -f "$1" ] && [ -s "$1" ]; then
            remark=$(cat $1)
    
            if [ $(( $NOW - $remark )) -gt "$REMARK_EXPIRE" ]; then
                rm -f $1
                remark=""
            fi
        else
            remark=""
        fi
    
        echo $remark
    }
    
    
    # *** function end ***
    
    cpuinfo=$(GetCpu)
    meminfo=$(GetMem)
    loadinfo=$(GetLoad)
    
    echo "cpu: ${cpuinfo}" >> "${CPU_LOG}"
    echo "mem: ${meminfo}" >> "${MEM_LOG}"
    echo "load: ${loadinfo}" >> "${LOAD_LOG}"
    
    exit 0

    crontab

    * * * * * /home/xxxx/ServerMonitor.sh
    * * * * * sleep 30; /home/xxxx/ServerMonitor.sh


  • 相关阅读:
    Hibernate学习(2)- hibernate.cfg.xml详解
    Hibernate学习(1)- 初识
    linux(centos6) 常用操作
    linux(centos6) 下安装 postgresql-9.3.1.tar.gz
    struts2 值栈分析
    struts2 paramsPrepareParamsStack拦截器简化代码(源码分析)
    idea 配置maven
    idea 使用github
    idea 配置svn
    idea 配置tomcat
  • 原文地址:https://www.cnblogs.com/fdipzone/p/3715046.html
Copyright © 2020-2023  润新知