找出1小時內占用cpu最多的10個進程的shell腳本


cpu時間是一項重要的資源,有時,我們需要跟蹤某個時間內占用cpu周期最多的進程。

在普通的桌面系統或膝上系統中,cpu處於高負荷狀態也許不會引發什么問題。但對於需要處理大量請求的服務器來講,cpu是極其重要的資源。

通過監視某個時期內cpu的使用情況,我們可以找出長期占用cpu的進程並對其進行優化,或調試其它相關問題。

在linux系統中,ps命令用於收集系統中進程的詳細信息。這些信息包括cpu使用情況、正在執行的命令、內存使用、進程狀態等。記錄在一個小時內占用過的cpu的進程,然后通過恰當地運用ps以及文本處理就可以找出占用cpu最多的10個進程。

例子,監視並計算一小時內cpu使用情況的shell腳本。

#!/bin/bash
# 文件名:pcpu_usage.sh
# 用途:計算1小時內進程的cpu占用情況
SECS=3600
UNIT_TIME=60
# 將SECS更改成需要進行監視的總秒數
# UNIT_TIME是取樣的時間間隔,單位是秒
STEPS=$(( $SECS / $UNIT_TIME ))
echo Watching CPU usage... ;
for ((i=0;i<STEPS;i++))
do
  ps -eo comm,pcpu | tail -n +2 >> /tmp/cpu_usage.$$
  sleep $UNIT_TIME
done
echo 
echo CPU eaters :
cat /tmp/cpu_usage.$$ | \
awk '
{ process[$1]+=$2 }
END{
   for(i in process)
   {
     printf("%-20s %s",i, process[i] ;
   }
}' | sort -nrk 2 | head
rm /tmp/cpu_usage.$$
#刪除臨時日志文件

輸出結果:
# ./pcpu_usage.sh
Watching CPU usage...
xofr      20
firefox-bin 15
bash      3
evince    2
pulseaudio 1.0
pcpu.sh   0.3
wpa_supplicant 0
wnck-applet 0
watchdog/0  0
usb-storage 0

注解:
以上腳本中,主要的輸入源是ps -eo comm,pcpu,其中comm表示命令名(command name),pcpu表示cpu例用率(CPU usae in percent)。該命令輸出所有進程名及CPU使用率。每個進程對應一行輸出。因為需要監視一個小時內CPU的使用情況,所以我們得在一個每次迭代時間為60秒的循環中不停地使用ps -eo comm,pcpu | tail -n +2來獲取CPU的使用統計數據,並將這些數據添加到文件/tmp/cpu_usage.$$中。60秒的迭代時間通過sleep 60來提供。這就使得每一分鍾執行一次ps。

tail -n +2用來將ps輸出中的頭部和COMMAND %CPU剝除。

cpu_usage.$$中的$$表示當前腳本的進程ID。假設進程ID為1345,那么在腳本執行時,它會被替換成/tmp/cpu_usage.1345。因為這是一個臨時文件,所以我們把它放在/tmp目錄中。

統計文件在1小時后,准備妥當,文件中包含了60項,分別對應每分鍾的進程狀態。
然后用awk求出每個進程的CPU使用情況。我們用了一個關聯數組來統計CPU的使用情況。其中進程名作為數組索引。
最后根據總的CPU使用情況依數值逆序排序,並通過head獲得前10項的值,加以輸出。

jquery中文網-原創文章,轉載請注明出處。


免責聲明!

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



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