CPU 是另一种会被失常进程(misbehaving process)耗尽的资源。Linux支持一些能够识别并对长期占用CPU的进程施加控制的命令。
9.5.1 预备知识
ps命令能够显示出系统中进程的详细信息。这些信息包括CPU使用情况、所执行的命令、内存占用、进程状态等。可以在脚本中使用ps命令识别出在一小时内占用CPU最多的进程。关于ps命令的更多细节,请参考第10章。
9.5.2 实战演练
让我们看看用于监视并计算一小时内CPU使用情况的shell脚本:
#!/bin/bash#文件名: pcpu_usage.sh#用途:计算1个小时内进程的CPU占用情况#将SECS更改成需要进行监视的总秒数#UNIT_TIME是取样的时间间隔,单位是秒SECS=3600UNIT_TIME=60STEPS=$(( $SECS / $UNIT_TIME ))echo Watching CPU usage... ;#采集数据,存入临时文件for((i=0;i<STEPS;i++))dops -eocomm,pcpu | egrep -v '(0.0)|(%CPU)' >> /tmp/cpu_usage.$$sleep $UNIT_TIMEdone#处理采集到的数据echoecho CPU eaters :cat /tmp/cpu_usage.$$ | \awk '2{ process[$1]+=$2; }END{for(i in process){printf("%-20s %s\n",i, process[i]) ;}}' | sort -nrk 2 | head#删除临时日志文件rm /tmp/cpu_usage.$$
输出如下:
$ ./pcpu_usage.shWatching CPU usage...CPU eaters :Xorg 20firefox-bin 15bash 3evince 2pulseaudio 1.0pcpu.sh 0.3wpa_supplicant 0wnck-applet 0watchdog/0 0usb-storage 0
9.5.3 工作原理
CPU 的使用情况是由第一个循环负责生成的,该循环的执行时长为 1 小时( 3600 秒)。每隔 1 分钟,命令ps -eocomm,pcpu就会产生一份系统活动报告。选项-e指定采集所有进程的数据,而不仅限于本次会话的进程。选项-o指定了输出格式。其中,comm指定输出命令名,pcpu指定输出CPU占用率。ps命令为每个进程输出一行,其中包含命令名及进程当时的CPU占用率。然后使用grep过滤这些行,删除未占用CPU的行(%CPU为0.0)以及头部信息COMMAND %CPU。处理后的结果被追加到临时文件中。
临时文件名为/tmp/cpu_usage.。其中,一个shell变量,值为当前脚本的进程ID(PID)。如果脚本的PID是1345,那么临时文件名就是/tmp/cpu_usage.1345。
统计文件在 1 小时后就准备妥当了,文件中包含了60项,分别对应每分钟的系统状态。awk计算出每个进程总的CPU使用情况并将其存入一个关联数组。该数组以进程名作为索引。最后根据总的CPU使用情况依数值执行逆序排序并利用head获得前10项。
9.5.4 参考
- 4.6 节讲解了 awk 命令。
- 3.13 节讲解了 tail 命令。
