這篇博客中所寫的腳本,在實際工作中並沒有什么卵用,工作中並不會用到這種腳本去監控。不過自己寫一遍,可以讓初學者對CPU、內存、磁盤等一些基礎知識和基礎命令更加了解。
1、利用vmstat工具監控CPU詳細信息,然后基於/proc/stat計算CPU利用率進行監控,超過80報警並提取出占用cpu最高的前十進程。
vmstat是Linux系統監控工具,使用vmstat命令可以得到關於進程、內存、內存分頁、堵塞IO、traps及CPU活動的信息。
r:運行隊列中的進程數;b:等待IO的進程數。
swpd:已用虛擬內存大小(k);free:空閑內存大小;buff:已用緩沖大小;cache:已用緩存大小。
si:每秒從交換區寫入內存的大小(kb/s);so:每秒從內存寫入交換分區的大小。
bi:每秒讀取的塊數;bo每秒寫入的塊數。
in:每秒中斷數,包括時鍾中斷;cs:每秒上下文切換數。
us(user time):用戶進程執行消耗cpu時間;sy(system time):系統進程執行消耗cpu時間;id:空閑時間(包括IO等待時間);wa:等待IO時間。
/proc/stat:
這個文件包含了所有CPU活動的信息,該文件中的所有值都是從系統啟動開始累計到當前時刻。可以利用其中信息計算cpu的利用率。
每行每個參數的意思為(以第一行為例,單位:jiffies,1jiffies=0.01秒):
user(62124):從系統啟動開始累計到當前時刻,用戶態的CPU時間,不包含 nice值為負進程。
nice(11):從系統啟動開始累計到當前時刻。
system(47890):從系統啟動開始累計到當前時刻,nice值為負的進程所占用的CPU時間。
idle(8715270):從系統啟動開始累計到當前時刻,除硬盤IO等待時間以外其它等待時間。
iowait(84729):從系統啟動開始累計到當前時刻,硬盤IO等待時間。
irq(0):從系統啟動開始累計到當前時刻,硬中斷時間。
softirq(1483):從系統啟動開始累計到當前時刻,軟中斷時間。
CPU時間=user+nice+system+idle+iowait+irq+softirq。
CPU利用率=(idle2-idle1)/(cpu2-cpu1)*100。
ps aux:
顯示其他用戶啟動的進程(a)
查看系統中屬於自己的進程(x)
啟動這個進程的用戶和啟動時間 (u)
代碼如下:
#!/bin/bash # CPU_us=$(vmstat | awk '{print $13}' | sed -n '$p') CPU_sy=$(vmstat | awk '{print $14}' | sed -n '$p') CPU_id=$(vmstat | awk '{print $15}' | sed -n '$p') CPU_wa=$(vmstat | awk '{print $16}' | sed -n '$p') CPU_st=$(vmstat | awk '{print $17}' | sed -n '$p') CPU1=`cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}'` sleep 5 CPU2=`cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}'` IDLE1=`echo $CPU1 | awk '{print $4}'` IDLE2=`echo $CPU2 | awk '{print $4}'` CPU1_TOTAL=`echo $CPU1 | awk '{print $1+$2+$3+$4+$5+$6+$7}'` CPU2_TOTAL=`echo $CPU2 | awk '{print $1+$2+$3+$4+$5+$6+$7}'` IDLE=`echo "$IDLE2-$IDLE1" | bc` CPU_TOTAL=`echo "$CPU2_TOTAL-$CPU1_TOTAL" | bc` #echo -e "IDLE2:$IDLE2\nIDLE1:$IDLE1\nCPU2:$CPU2_TOTAL\nCPU1:$CPU1_TOTAL" #echo -e "IDLE:$IDLE\nCPU:$CPU_TOTAL" RATE=`echo "scale=4;($CPU_TOTAL-$IDLE)/$CPU_TOTAL*100" | bc | awk '{printf "%.2f",$1}'` echo -e "us=$CPU_us\tsy=$CPU_sy\tid=$CPU_id\twa=$CPU_wa\tst=$CPU_st" echo "CPU_RATE:${RATE}%" CPU_RATE=`echo $RATE | cut -d. -f1` #echo "CPU_RATE:$CPU_RATE" if [ $CPU_RATE -ge 80 ] then echo "CPU Warn" ps aux | grep -v USER | sort -rn -k3 | head fi
2、利用free工具監控內存利用率,超過80報警並提取出占用內存最高的前十進程。
代碼如下:
#!/bin/bash # total=$(free -m | sed -n '2p' | awk '{print $2}') used=$(free -m | sed -n '2p' | awk '{print $3}') free=$(free -m | sed -n '2p' | awk '{print $4}') shared=$(free -m | sed -n '2p' | awk '{print $5}') buff=$(free -m | sed -n '2p' | awk '{print $6}') cached=$(free -m | sed -n '2p' | awk '{print $7}') rate=`echo "scale=2;$used/$total" | bc | awk -F. '{print $2}'` echo -e "total\tused\tfree\tshared\tbuffer\tavailable" echo -e "${total}M\t${used}M\t${free}M\t${shared}M\t${buff}M\t${cached}M\nrate:${rate}%" if [ $rate -ge 80 ] then echo "Memory Warn" ps aux | grep -v USER | sort -rn -k4 | head fi
3、利用df命令監控磁盤利用率,超過80報警。
df :顯示磁盤分區上的可使用的磁盤空間。
-h 以更易讀的方式顯示;
-P 使用POSIX的輸出格式。
#!/bin/bash # DEV=`df -hP | grep '^/dev/*' | cut -d' ' -f1 | sort` for I in $DEV do dev=`df -Ph | grep $I | awk '{print $1}'` size=`df -Ph | grep $I | awk '{print $2}'` used=`df -Ph | grep $I | awk '{print $3}'` free=`df -Ph | grep $I | awk '{print $4}'` rate=`df -Ph | grep $I | awk '{print $5}'` mount=`df -Ph | grep $I | awk '{print $6}'` echo -e "$I:\tsize:$size\tused:$used\tfree:$free\trate:$rate\tmount:$mount" F=`echo $rate | awk -F% '{print $1}'` if [ $F -ge 80 ];then echo "$mount Warn" else echo "It's OK" fi done
CPU物理信息
查看物理cpu個數:
cat /proc/cpuinfo | grep "physical id" | uniq | wc -l
查看cpu核數:
cat /proc/cpuinfo | grep "cpu cores" | uniq
查看邏輯cpu個數:
cat /proc/cpuinfo | grep "processor" | wc -l