以%为单位显示终端使用的 CPU 数量 在创建 bash 脚本的过程中没有理解问题。
for x in $(seq 1 11);do sleep 5;grep -w cpu /proc/stat ; done | awk '{
print (o2+o4-$2-$4)*100/(o2+o4+o5-$2-$4-$5) "%"
o2=$2;o4=$4;o5=$5}'
o2
喜欢是什么o2, o4, o5
意思?是愚蠢的问题吗?
答案1
它们是脚本中的变量awk
...这种格式可能会使其更清晰:
for x in $(seq 1 11); do
sleep 5
grep -w cpu /proc/stat
done | \
awk '
{
print (o2 + o4 - $2 - $4) * 100 / (o2 + o4 + o5 - $2 - $4 - $5) "%"
o2=$2
o4=$4
o5=$5
}'
您正在从以下行中选取包含“cpu”的任何行/proc/stat
:
$ grep -w cpu /proc/stat
cpu 737017 2198 503480 221363877 201487 97326 0 0 0 0
每 5 秒执行一次:
for x in $(seq 1 11); do
sleep 5
grep -w cpu /proc/stat
done
将输出通过管道传输到awk
。
awk
正在对字段 2、4 和 5($2
、$4
和$5
)进行计算,并将它们存储在变量o2
、o4
和中o5
。
awk '
{
print (o2 + o4 - $2 - $4) * 100 / (o2 + o4 + o5 - $2 - $4 - $5) "%"
o2=$2
o4=$4
o5=$5
}'
/proc/stat
您可以从手册页中找到有关的更多信息,这里。
/proc/stat
kernel/system statistics. Varies with architecture. Common
entries include:
cpu 3357 0 4313 1362393
The amount of time, measured in units of USER_HZ
(1/100ths of a second on most architectures, use
sysconf(_SC_CLK_TCK) to obtain the right value), that
the system spent in various states:
[...]
nice (2) Time spent in user mode with low priority
(nice).
[...]
idle (4) Time spent in the idle task. This value
should be USER_HZ times the second entry in the
/proc/uptime pseudo-file.
iowait (since Linux 2.5.41)
(5) Time waiting for I/O to complete.
[...]
答案2
o2、o4、o5 没有任何意义。它们看起来像是变量,但变量是在计算之后设置的。如果要使用变量,则必须在使用之前设置它。
这里有一个更简单的计算来说明这个问题。我想将两个数字相加。
$ echo 6 4 | awk '{ print $1 + $2 }'
10
$ echo 6 4 | awk '{
print o1 + o2 # print the sum of two numbers using unset variables
print o1, o2 # print the unset variables
o1=$1 # set the variables
o2=$2
print o1, o2 # print the set variables
}'
0
6 4
awk 决定使用 0 来表示计算中未设置的值。
查看 CPU 计算,它主要执行以下操作:
(0 + 0 - x - y) * 100 / (0 + 0 - x - y - z)
最后用负数除以负数得到一个正数。
在这种情况下,以下内容就足够了:
$ grep -w cpu /proc/stat | awk '{ print ($2+$4)*100/($2+$4+$5) "%" }'