在bash中计算每个进程的CPU使用率%

时间:2015-11-14 15:16:00

标签: linux bash process

我正在计算每个流程' CPU使用率%,我使用此脚本执行此操作:

#!/bin/bash

function getTotalTime() {
    echo $(awk '{print $14+$15}' /proc/${1}/stat)
}

function getStartTime() {
    echo $(awk '{print $22}' /proc/${1}/stat)
}

function getActualCPUTime() {
    echo $(cat /proc/stat | awk '/cpu / {for(i=1;i<=7;++i) sum+=$i; print sum}')
}

pidArray=($(ls -l /proc | awk '$9 ~/^[0-9]+/ {print $9}'))
let index=0

for i in ${!pidArray[*]}
do
    if [ ! -z ${pidArray[$i]} ] && [ -e "/proc/${pidArray[$i]}/stat" ]
    then
        cpuP[$index]=$(getTotalTime ${pidArray[$i]})
        let index+=1
    fi
done

cpuT=$(getActualCPUTime)
sleep 1
#hz=$(getconf CLK_TCK)
cpuT=$((($(getActualCPUTime)-$cpuT)))
#uptime=$(cat /proc/uptime | awk '{print $1}')

let index=0
for i in ${!pidArray[*]}
do
    if [ ! -z ${pidArray[$i]} ] && [ -e "/proc/${pidArray[$i]}/stat" ]
    then        
        #aux=$(($(getTotalTime ${pidArray[$i]})-${cpuP[$index]}))
        #echo "$aux ->  $cpuT"
        cpuP[$index]=$((100*($(getTotalTime ${pidArray[$i]})-${cpuP[$index]})/$cpuT))


        echo ${cpuP[$index]}
        let index+=1 
    fi  
done

为了测试,我开始一两次cat /dev/zero > /dev/null使一些进程使用CPU,但当我运行我的脚本并检查%我看到~150我是否正在运行其中一个如果运行两个,则进程或两个~90%。

我认为它与/proc/stat/proc/PID/stat的单位有关,但我无法解决这个问题。

任何线索?。

由于

1 个答案:

答案 0 :(得分:0)

我设法修复它,问题是读取值的顺序。

在我阅读之前

processes,cpu,sleep,cpu,processes

正确的方法是

cpu,processes,sleep,cpu,processes

这就是为什么cpu值太小而我在某些过程中得到150 +%。