当前位置: > shell编程 >

找出1小时内占用cpu最多的10个进程的shell脚本

时间:2014-09-10 19:16来源:linux.it.net.cn 作者:it

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项的值,加以输出。

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容