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

等待幾分鍾就可以查看啦

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM