我必须显示应用程序的 CPU 使用率并实时更新。我使用以下命令获取 CPU 使用率:
top -b -n 2 | grep Cpu | awk '{printf "CPU Load:%.2f\n", $(NF-13) + $(NF-15)}' | sed -n '2 p'
上述命令确实给了我所需的结果,但过了一段时间后它停止工作,我没有得到更新的 CPU 使用率。任何帮助都可以解释为什么命令在一段时间后停止工作。
答案1
根据以下条件计算 CPU 使用率Linux CPU 利用率:
#!/bin/bash
declare -i total idle
# man: proc(5)
# Read first line, skip `cpu', guest, guest_nice.
cpu_usage(){
local -a a
local -n b=$1 c=total d=idle
local e
local -i f g
mapfile -t -s 2 -n 8 -d \ a < /proc/stat
e=${a[*]}
((b=(((f=(g=${e// /+})-c)-(a[3]-d))*1000/f+5)/10))
c=${g}
d=${a[3]}
}
# Hide cursor and bring it back on exit.
trap 'tput cnorm' EXIT; tput civis
# An example how you can use cpu_usage
# in a while loop. cpu_usage will use the
# supplied argument as a name reference.
while true; do
cpu_usage load
printf \\r%d%%\ \\b $load
sleep 0.2
done
答案2
您正在从最后一个字段开始倒数,并假设字段数始终相同。但事实并非如此。举个例子,可能还有更多:
doug@s18:~$ top -b -n 2 | grep Cpu
%Cpu(s): 98.9 us, 1.1 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
请注意,在第二次印刷中只有 16 个字段而不是 17 个,因为 : 和“us”负载的第一位数字之间的正常空格不存在,已被“1”占用,因此引用是错误的。
更详细地看,我将在下面添加字段编号(请记住,默认的字段分隔符是空格和制表符):
%Cpu(s): 98.9 us, 1.1 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
.
%Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
确实,运行命令的输出有时会给出错误的答案(循环运行,其中实际负载始终为 100%):
CPU Load: 100.00
CPU Load: 0.00
CPU Load: 0.00
CPU Load: 100.00
CPU Load: 0.00
CPU Load: 0.00
这个 hack 似乎可以解决这个问题:
top -b -n 2 | grep Cpu | sed 's/:/ /g' | awk '{printf "CPU Load:%7.2f\n", $(NF-13) + $(NF-15)}' | sed -n '2 p'
我不知道这是不是你的问题,也不知道这是否是唯一的问题。