“o*” 是什么意思?

“o*” 是什么意思?

以%为单位显示终端使用的 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

将输出通过管道传输到awkawk正在对字段 2、4 和 5($2$4$5)进行计算,并将它们存储在变量o2o4和中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) "%" }'

相关内容