我有一个从/proc/stat
读取并计算CPU使用率的脚本。在/proc/stat
中有三行相关的内容:
cpu 1312092 24 395204 12582958 77712 456 3890 0 0 0
cpu0 617029 12 204802 8341965 62291 443 2718 0 0 0
cpu1 695063 12 190402 4240992 15420 12 1172 0 0 0
目前,我的脚本仅读取第一行并从中计算使用情况:
cpu=($( cat /proc/stat | grep '^cpu[^0-9] ' ))
unset cpu[0]
idle=${cpu[4]}
total=0
for value in "${cpu[@]}"; do
let total=$(( total+value ))
done
let usage=$(( (1000*(total-idle)/total+5)/10 ))
echo "$usage%"
这个能够正常工作,因为脚本只解析这一行代码:
cpu 1312092 24 395204 12582958 77712 456 3890 0 0 0
轻松获取以cpu0
和cpu1
开头的行并不难。
cpu=$( cat /proc/stat | grep '^cpu[0-9] ' )
但我不知道如何遍历每一行并应用相同的过程。我已经尝试在子shell中重置内部字段分隔符,如下所示:
cpus=$( cat /proc/stat | grep '^cpu[0-9] ' )
(
IFS=$'\n'
for cpu in $cpus; do
cpu=($cpu)
unset cpu[0]
idle=${cpu[4]}
total=0
for value in "${cpu[@]}"; do
let total=$(( total+value ))
done
let usage=$(( (1000*(total-idle)/total+5)/10 ))
echo -n "$usage%"
done
)
但是这会导致语法错误。
line 18: (1000*(total-idle)/total+5)/10 : division by 0 (error token is "+5)/10 ")
如果我在循环中回显
cpu
变量,它似乎正确地分隔了行。我查看了这个线程,我认为我将 cpu 变量分配给一个数组是正确的,但是否还有其他错误我没有注意到?我将我的脚本放到这个网站上,除了一个关于在
$()
中使用 cat
的警告之外,它并没有显示任何错误,所以我感到困惑。
awk
来完成这个任务。 - Stavenawk
允许浮点除法的特性。我在我的 bash 代码中使用的(1000 * (total - idle) / total + 5) / 10
技巧(也在你的awk
代码中)在awk
中是不必要的。它只会增加混乱。 - Michael A