zoukankan      html  css  js  c++  java
  • Shell----监控CPU/内存/负载高时的进程

    Shell----监控CPU/内存/负载高时的进程

    1、编写脚本

    vim cpu-warning.sh

    #!/bin/bash
    #监控系统cpu的情况脚本程序
    
    #取当前空闲cpu百份比值(只取整数部分)
    [ ! -f /bin/sar ] && yum install sysstat -y &>/dev/null
    cpu_idle=`sar -u 1 5|awk 'END{print $NF}'|awk -F'.' '{print $1}'`
    
    #设置空闲cpu的告警值为20%,如果当前cpu使用超过80%(即剩余小于20%),立即发邮件告警...
    if (($cpu_idle < 20)); then
    
            #取系统当前时间(以覆盖的方式写入文件>)
            date >> /home/sunli/scripts/cpu_day.txt
    
            #提取服务器1分钟、5分钟、15分钟的负载情况
            top -b -n 1 | grep Cpu >> /home/sunli/scripts/cpu_day.txt
    
            # 提取服务器占cpu和内存最高前10位进程程序情况
            echo "%MEN  top  10" >> /home/sunli/scripts/cpu_day.txt
            ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head >> /home/sunli/scripts/cpu_day.txt
            echo "%CPU  top  10" >> /home/sunli/scripts/cpu_day.txt
            ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head >> /home/sunli/scripts/cpu_day.txt
    fi

     vim load-warning.sh

    load_15=`uptime | awk '{print $NF}'`
    
    #计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
    average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`
    
    #取上面平均负载值的个位整数
    average_int=`echo $average_load | cut -f 1 -d "."`
    
    #设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
    load_warn=0.70
    
    #当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较
    #if (($average_int > 0)); then
    #      /home/sunli/scripts/load-check.sh
    #else
    
    #当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0 )
        load_now=`expr $average_load > $load_warn`
    
    #如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员
        if (($load_now == 1)); then
    
                    #取系统当前时间(以覆盖的方式写入文件>)
                    date >> /home/sunli/scripts/load_day.txt
    
                    #提取服务器1分钟、5分钟、15分钟的负载情况
                    uptime | awk '{print $8,$9,$10,$11,$12}' >> /home/sunli/scripts/load_day.txt
    
                    # 提取服务器占cpu和内存最高前10位进程程序情况
                    echo "%MEN  top  10" >> /home/sunli/scripts/load_day.txt
                    ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head >> /home/sunli/scripts/load_day.txt
                    echo "%CPU  top  10" >> /home/sunli/scripts/load_day.txt
                    ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head >> /home/sunli/scripts/load_day.txt
        fi
    #fi

    vim mem-warning.sh

    #!/bin/bash
    #系统分配的交换分区总量
    Mem_total=`free -m | grep Mem| awk '{print  $2}'`
    
    #当前剩余的交换分区free大小
    Mem_free=`free -m | grep Mem| awk '{print  $4}'`
    
    #当前已使用的交换分区used大小
    Mem_used=`free -m | grep Mem| awk '{print  $3}'`
    
    if (($Mem_used != 0)); then
    
    #如果交换分区已被使用,则计算当前剩余交换分区free所占总量的百分比,用小数来表示,要在小数点前面补一个整数位0
       Mem_per=0`echo "scale=2;$Mem_free/$Mem_total" | bc`
    
    #设置交换分区的告警值为20%(即使用超过80%的时候告警)。
       Mem_warn=0.20
    
    #当前剩余交换分区百分比与告警值进行比较(当大于告警值(即剩余20%以上)时会返回1,小于(即剩余不足20%)时会返回0 )
       Mem_now=`expr $Mem_per > $Mem_warn`
    
    #如果当前交换分区使用超过80%(即剩余小于20%,上面的返回值等于0),立即发邮件告警
      if (($Mem_now == 0)); then
        #取系统当前时间(以覆盖的方式写入文件>)
            date >> /home/sunli/scripts/mem_day.txt
    
            #提取服务器1分钟、5分钟、15分钟的负载情况
            free -m >> /home/sunli/scripts/mem_day.txt
    
            # 提取服务器占mem和内存最高前10位进程程序情况
            echo "%MEN  top  10" >> /home/sunli/scripts/mem_day.txt
            ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head >> /home/sunli/scripts/mem_day.txt
            echo "%CPU  top  10" >> /home/sunli/scripts/mem_day.txt
            ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head >> /home/sunli/scripts/mem_day.txt
      fi
    fi

    2、计划任务

    crontab -e

    */1 * * * *  /home/sunli/scripts/load-warning.sh > /dev/null 2>&1
    */1 * * * *  /home/sunli/scripts/cpu-warning.sh > /dev/null 2>&1
    */1 * * * *  /home/sunli/scripts/mem-warning.sh > /dev/null 2>&1

    3、测试

    安装系统压力测试工具

    yum -y install stress

    测试

    stress --cpu 1

    等待几分钟就可以查看啦

  • 相关阅读:
    BZOJ1862: [Zjoi2006]GameZ游戏排名系统
    BZOJXXXX: [IOI2000]邮局——四边形不等式优化初探
    BZOJ1801: [Ahoi2009]chess 中国象棋
    BZOJ1505: [NOI2004]小H的小屋
    BZOJ1899: [Zjoi2004]Lunch 午餐
    BZOJ1057: [ZJOI2007]棋盘制作
    BZOJ1100: [POI2007]对称轴osi
    BZOJ1123: [POI2008]BLO
    线性规划之单纯形讲解
    BZOJ 3265 志愿者招募加强版(单纯形)
  • 原文地址:https://www.cnblogs.com/user-sunli/p/14160352.html
Copyright © 2011-2022 走看看