1. 程式人生 > >Shell----監控CPU/記憶體/負載高時的程序

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

等待幾分鐘就可以檢視啦

&n