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

等待几分钟就可以查看啦

 

posted @ 2020-12-19 18:09  梦里花落知多少sl  阅读(1145)  评论(0编辑  收藏  举报