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
等待幾分鐘就可以檢視啦