正在为 bash 中的每个进程计算 CPU 使用百分比
Calculating CPU usage % for each process in bash
我正在计算每个进程的 CPU 使用百分比,我用这个脚本来计算:
#!/bin/bash
function getTotalTime() {
echo $(awk '{print +}' /proc//stat)
}
function getStartTime() {
echo $(awk '{print }' /proc//stat)
}
function getActualCPUTime() {
echo $(cat /proc/stat | awk '/cpu / {for(i=1;i<=7;++i) sum+=$i; print sum}')
}
pidArray=($(ls -l /proc | awk ' ~/^[0-9]+/ {print }'))
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 }')
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
的单位有关系,但是我想不通。
有什么线索吗?
谢谢
我设法解决了它,问题是读取值的顺序。
在我阅读之前
processes,cpu,sleep,cpu,processes
正确的方法是
cpu,processes,sleep,cpu,processes
这就是 cpu 值太小的原因,我在某些过程中得到 150+%。
我正在计算每个进程的 CPU 使用百分比,我用这个脚本来计算:
#!/bin/bash
function getTotalTime() {
echo $(awk '{print +}' /proc//stat)
}
function getStartTime() {
echo $(awk '{print }' /proc//stat)
}
function getActualCPUTime() {
echo $(cat /proc/stat | awk '/cpu / {for(i=1;i<=7;++i) sum+=$i; print sum}')
}
pidArray=($(ls -l /proc | awk ' ~/^[0-9]+/ {print }'))
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 }')
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
的单位有关系,但是我想不通。
有什么线索吗?
谢谢
我设法解决了它,问题是读取值的顺序。
在我阅读之前
processes,cpu,sleep,cpu,processes
正确的方法是
cpu,processes,sleep,cpu,processes
这就是 cpu 值太小的原因,我在某些过程中得到 150+%。