每次都获得相同的 CPU 使用率。

KK *_*tel 14 command-line cpu

当我执行以下命令来获取 cpu 使用率时,我得到了很好的 + 用户 cpu 使用率。

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 
Run Code Online (Sandbox Code Playgroud)

输出:

14.5
Run Code Online (Sandbox Code Playgroud)

在这里,我遇到的问题是输出取决于 top 命令,因此它不会像 top 命令一样立即更改。所以我没有立即获得正确的 CPU。它提供相同的输出并且不会改变。

我想在输出中获得实时 cpuusage。请帮助我改进我的命令。

Rus*_*lan 15

你是对的,top似乎在第一次迭代时给出了不正确的 CPU 使用率。您可以像这样解决这个问题:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'
Run Code Online (Sandbox Code Playgroud)

这当然需要两倍的时间,但无论如何它都会起作用。

如果您仍然希望它更快地工作,您可以使用-d选项,例如对于 1 秒的总测量周期,使用它的一半:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'
Run Code Online (Sandbox Code Playgroud)


小智 7

从技术上讲,第一个top并不总是输出相同的值;它只输出自上次启动以来的平均 CPU 负载。因为top使用/proc/statstats的 delta来计算 CPU 负载,所以在与零比较时计算第一个值,产生不正确(但 WAD)的结果。

如果不想使用top,可以直接解析/proc/stat

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'
Run Code Online (Sandbox Code Playgroud)

这种方式也更快、更准确。

您可以使用stress以下方法对其进行测试:

stress -c 1 -q &
Run Code Online (Sandbox Code Playgroud)

并且做

killall stress
Run Code Online (Sandbox Code Playgroud)

后。


ter*_*don 5

只是为了扩展@Ruslan 的答案,top在用户、系统进程和nice进程之间分配 CPU 使用率,我们想要三者的总和。因此,我们可以topbatch 模式下运行,这允许我们解析其输出。然而,正如这里所解释的,第一次迭代top -b返回自启动以来的百分比,因此我们至少需要两次迭代 ( -n 2) 才能获得当前百分比。为了加快速度,您可以将d迭代之间的elay设置为0.01

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
Run Code Online (Sandbox Code Playgroud)


dai*_*isy 0

在 shell 中使用 watch 命令或 for 循环,

IEwatch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"