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
等待几分钟就可以查看啦