Obtenir l'utilisation du processeur en temps réel

11

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

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

Production:

14.5

Ici, je reçois un problème, c'est que la sortie dépend de la commande supérieure, elle ne change donc pas instantanément en tant que commande supérieure. Donc, je ne reçois pas instantanément le processeur correct. Il donne la même sortie et ne change pas.

Je veux obtenir une utilisation du processeur en temps réel en sortie. Veuillez m'aider à améliorer ma commande.

Ketan Patel
la source
surveillance en temps réel askubuntu.com/questions/293426/…
Qasim
Ce script bash simple fait exactement cela: askubuntu.com/a/450136/243213
Craig van Tonder

Réponses:

20

Si vous pouvez vous permettre un délai d'une seconde, cela imprimera l'utilisation du processeur sous forme de pourcentage simple:

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

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

Paul
la source
Ne me donne pas un% précis (comparaison avec htop)
Lepe
1
Vous devez utiliser vmstat 1 2comme ceci: echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] Sinon , votre vmstatva donner des valeurs depuis le démarrage qui est probablement pas ce que vous êtes après.
Joe
joe merci ça marche. s'il vous plaît Paul, modifiez la réponse pour que tout le monde puisse voir la bonne ligne de commande
Pavlos Theodorou
Merci pour la capture que, Joe et Pavlos! Je n'ai pas remarqué qu'une partie de la page de manuel.
Paul
9

Ceci est un problème connu avec top. Comme expliqué ici , la 1ère itération de top -brendements les pourcentages depuis le démarrage, il faut donc au moins deux itérations ( -n 2) pour obtenir le pourcentage actuel. Pour accélérer les choses, vous pouvez régler le delay entre les itérations à 0.01. topdivise l' utilisation du CPU entre l' utilisateur, les processus du système et des niceprocessus, nous voulons que la somme des trois. Enfin, vous grepla ligne contenant les pourcentages CPU et ensuite utiliser gawkà l' utilisateur somme, système et agréable processus:

    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
terdon
la source
Toutes les autres méthodes, y compris sar, mpstat ... etc, affichent un 2/3% alors que cette commande affiche toujours 50%.
CMCDragonkai
@CMCDragonkai les chiffres devraient changer (je viens de le vérifier) ​​êtes-vous sûr de le copier / coller correctement? Notez également que sur les systèmes avec plusieurs processeurs, topsignalera le% d'utilisation en pourcentage d'un seul processeur. Cela signifie que vous obtiendrez souvent des pourcentages beaucoup plus élevés. Voir le point 9 ici .
terdon
Je pense que cette commande n'est peut-être pas compatible avec mon système. Mais il est évident que toutes les autres méthodes que j'ai essayées m'obtiennent un pourcentage de 1/2/3%, ce que je vois si je lance htop, alors que cette commande me donne une anomalie.
CMCDragonkai
@CMCDragonkai en raison des multiples processeurs. Vous pouvez soit obtenir le nombre renvoyé par ceci et diviser par le nombre de cœurs ou vous pouvez utiliser topen mode interactif (juste exécuter top) et, une fois là-bas, appuyez sur I(Maj + i) pour voir une répartition par cœurs.
terdon
Je n'ai qu'un seul processeur.
CMCDragonkai
7

J'ai essayé plusieurs façons, 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 d' ici

Lepe
la source
mon linux (Linux machine_name 4.4.0-127-generic # 153-Ubuntu SMP Sat May 19 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux) n'a pas de colonne $ 15 (ligne cpu du fichier / proc / stat) : cpu 17411187 27478 594887 646652526 585551 0 31838 0 0 0
Kemin Zhou
1
Meilleure réponse! Merci! Ma variation: cat <(grep 'cpu' / proc / stat) <(sleep 0.1 && grep 'cpu' / proc / stat) | awk -v RS = "" '{printf "% .1f", (13 $ - 2 $ + 15 $ - 4 $) * 100 / (13 $ - 2 $ + 15 $ - 4 $ + 16 $ - 5 $)}'
maXp du
La différence maXp est que son imprimé est arrondi avec une seule décimale:, ce %.1fqui à mon avis est plus lisible par l'homme et utile si vous utilisez cette sortie dans d'autres scripts.
lepe
0

Utilisez -n2. Cela produira deux lignes. La première fois, topla ligne n'est pas qualifiée pour l'état à ce moment. Ajustez ensuite votre script pour ignorer la première ligne.

ILP
la source