Shell----監控CPU/內存/負載高時的進程

Shell----監控CPU/內存/負載高時的進程

一、編寫腳本

 

vim cpu-warning.shvim

#!/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.shbash

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

 

 

 

二、計劃任務

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

 

三、測試

安裝系統壓力測試工具測試

yum -y install stressspa

測試code

stress --cpu 1blog

等待幾分鐘就能夠查看啦進程

相關文章
相關標籤/搜索