Cosa significa `o *`?


1

La visualizzazione della quantità di CPU utilizzata al terminale in% Question non viene compresa nel mezzo della creazione di uno script 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}'

Cosa fa o2 piace o2, o4, o5 significare? è una domanda sciocca?

Risposte:


2

Sono variabili nel awk script ... Questa formattazione potrebbe rendere più chiaro:

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
    }'

Stai prendendo qualsiasi linea che ha "CPU" in esso da /proc/stat:

$ grep -w cpu /proc/stat
cpu  737017 2198 503480 221363877 201487 97326 0 0 0 0

Farlo ogni 5 secondi:

for x in $(seq 1 11); do
  sleep 5
  grep -w cpu /proc/stat
done

E piping l'output in awk. awk sta prendendo i campi 2, 4 e 5 ( $2, $4 e $5 ) facendo un calcolo e memorizzandoli in variabili o2, o4, e o5.

awk '
    {
      print (o2 + o4 - $2 - $4) * 100 / (o2 + o4 + o5 - $2 - $4 - $5) "%"
      o2=$2
      o4=$4
      o5=$5
    }'

Puoi trovare maggiori informazioni su /proc/stat dalla pagina man, Qui .

/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 e O5 non significano nulla. Sembrano dovrebbero essere variabili, ma le variabili sono impostate dopo il calcolo. Se si desidera utilizzare una variabile, è necessario impostarla prima di utilizzarla.

Ecco un calcolo più semplice per illustrare il problema. Voglio aggiungere due numeri.

$ 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 decide di usare 0 per rappresentare il valore non impostato nel calcolo.

Osservando il calcolo della CPU, essenzialmente fa quanto segue:

(0 + 0 - x - y) * 100 / (0 + 0 - x - y - z)

Si finisce con un numero negativo diviso per un numero negativo che produce un numero positivo.

In questo caso, sarebbe bastato quanto segue:

$ grep -w cpu /proc/stat | awk '{ print ($2+$4)*100/($2+$4+$5) "%" }'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.