web-dev-qa-db-fra.com

Obtenir l'utilisation du processeur en temps réel

Lorsque j'exécute la commande suivante pour obtenir l'utilisation du processeur, j'obtiens l'utilisation de Nice + utilisateur.

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

Sortie:

14.5

Le problème est que la sortie dépend de la commande top, elle ne change donc pas instantanément en tant que commande top. Donc, je ne reçois pas le cpu correct instantanément. Il donne la même sortie et ne change pas.

Je veux obtenir l'utilisation du processeur en temps réel en sortie. Aidez-moi s'il vous plaît à améliorer ma commande.

11
Ketan Patel

Si vous pouvez vous permettre un délai d'une seconde, cela affichera l'utilisation de la CPU sous forme de pourcentage simple:

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(Sans le délai d'une seconde, vmstat ne peut imprimer que les valeurs moyennes depuis le démarrage.)

18
Paul

Il s'agit d'un problème connu avec topname__. Comme expliqué ici , la 1ère itération de top -b renvoie les pourcentages depuis le démarrage, il nous faut donc au moins deux itérations (-n 2) pour obtenir le pourcentage actuel. Pour accélérer les choses, vous pouvez définir le dname__elay entre les itérations sur 0.01. topdivise l'utilisation du processeur entre l'utilisateur, les processus système et Nicename__, nous voulons la somme des trois. Enfin, vous grepla ligne contenant les pourcentages de CPU, puis vous utilisez gawkpour additionner les processus utilisateur, système et Nice:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode
8
terdon

J'ai essayé plusieurs manières, mais cela me semble le plus précis:

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

Je l'ai eu de ici

6
lepe

Utilisez -n2. Cela produira deux lignes. La 1ère fois topimprime la ligne ne remplit pas les conditions pour l'état à ce moment-là. Puis ajustez votre script pour ignorer la première ligne.

0
ilp