Comment obtenir l'utilisation globale du processeur (par exemple 57%) sous Linux [fermé]


197

Je me demande comment vous pouvez obtenir l'utilisation du processeur du système et la présenter en pourcentage en utilisant bash, par exemple.

Exemple de sortie:

57%

Dans le cas où il y a plus d'un noyau, ce serait bien si un pourcentage moyen pouvait être calculé.


1
@julesanchez la valeur doit être envoyée ailleurs, par conséquent, elle doit être un int
user1199739

faire top> myfile.txt Et appliquer votre filtre en post-traitement, n'est-ce pas?
JuSchz

11
Une commande qui ne nécessite pas de sysstat:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon

7
Réouverture Je ne comprends pas pourquoi cela a été jugé hors sujet, est-ce que ceux qui l'ont fermé pourraient vouloir élaborer?
Jonathan H

3
Ma compréhension de /proc/statest très limité, mais celui - ci-liner fonctionne assez bien pour moi: cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'. Avec% .2f, vous pouvez contrôler le nombre de décimales que vous souhaitez générer, et avec sleep 1vous pouvez définir le temps sur lequel vous voulez faire la moyenne, c'est-à-dire s'il fait ce que je pense. Vous pouvez le mettre dans une boucle while bash, pour le tester en temps réel.
Yeti

Réponses:


174

Jeter un coup d'œil à cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

EDIT veuillez lire les commentaires avant de copier-coller ceci ou de l'utiliser pour tout travail sérieux. Cela n'a pas été testé ni utilisé, c'est une idée pour les personnes qui ne veulent pas installer un utilitaire ou pour quelque chose qui fonctionne dans n'importe quelle distribution. Certaines personnes pensent que vous pouvez tout "apt-get install".

REMARQUE: ce n'est pas l' actuel utilisation processeur, mais de l'utilisation globale du processeur dans tous les cœurs depuis le démarrage du système. Cela pourrait être très différent de l'utilisation actuelle du processeur. Pour obtenir la valeur actuelle, top (ou un outil similaire) doit être utilisé.

L'utilisation actuelle du processeur peut être calculée avec:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

12
Mais vous devez installer mpstat comme vous le recommandez ci-dessus. Beaucoup de gens n'ont pas cette flexibilité. cat / proc / stat puis pipe est beaucoup plus facile que mpstat que vous recommandez.
vimdude

12
+1 Je ne comprends pas pourquoi l'analyse d'un autre utilitaire est meilleure que l'analyse/proc/stat
Réinstallez Monica s'il vous plaît

9
système + utilisateur + inactif = 100%. Alors peut-être quelque chose comme: grep 'cpu' / proc / stat | awk '{cpu_usage = ($ 2 + $ 4) * 100 / ($ 2 + $ 4 + $ 5)} END {print cpu_usage "%"}'
vimdude

106
Je pense que cette solution ne montre pas la charge actuelle du processeur, mais la charge moyenne du processeur depuis le démarrage du processeur.
Etienne

11
@jlliagre, oui c'est vrai. Pour calculer l'utilisation du processeur ACTUELLE non moyenne, vous devrez prendre une valeur de 1 $, puis retarder, puis prendre une valeur de 1 $ et voir la différence. C'est l'utilisation actuelle du processeur.
vimdude

102

Tu peux essayer:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

11
Chaque fois que j'exécute cette commande, j'obtiens exactement la même sortie ( 32.7%).
alanaktion

13
Un résultat plus précis est donné lorsque j'utilise top -bn2, mais cela prend beaucoup de temps. D'après ce que j'ai lu, cela semble être le seul moyen d'obtenir un résultat précis.
alanaktion

7
top -bn1semble extrêmement inexact sur mon système FC20. top -bn2semble bien fonctionner.
Martin Tournoij

24
La commande dans cette réponse semble être écrite pour les systèmes où les top -vretours procps-ng(par exemple, Fedora). On trouve également procps, par exemple, sur Ubuntu et CentOS, où la commande ne fonctionne pas (indique toujours 100%, car l'analyse échoue en raison de la mise en forme différente de la ligne avec les chiffres du processeur). Voici une version qui fonctionne avec les deux implémentations:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0

2
Note côté: sur Mac OS X, utilisez les touches suivantes: top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'.
mklement0

38

Essayez à mpstatpartir du sysstatpackage

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

Ensuite, cutou greppour analyser les informations dont vous avez besoin:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

1
Je ne crois pas que cela montre le CPU total
user1199739

Je dirais que c'est 100% inactif, c'est l'utilisation totale du processeur (en%)
Peter Svensson

C'est le pourcentage «non» utilisé. Cette réponse était bonne, jusqu'au grep | queue | awk part ...
jordanm

Je changerais la awkpartie en:, awk -F " " '{print (100 - $12)"%"}'ce qui donne la sortie formatée comme il le voulait, mais sinon cela me semble bien.
Dan Fego

1
@jordanm Toutes les vérités; J'ai voté davantage parce que cela fonctionne. Je ferais ça, personnellement:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego

22

Autant donner une réponse réelle avec ma solution, inspirée de celle de Peter Liljenberg:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

Cela utilisera awkpour imprimer 100 moins le 12ème champ (inactif), avec un signe de pourcentage après lui. awkne le fera que pour une ligne où le 12ème champ contient uniquement des nombres et des points ($12 ~ /[0-9]+/ ).

Vous pouvez également faire la moyenne de cinq échantillons, à une seconde d'intervalle:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

Testez-le comme ceci:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

14
Il est préférable d'exécuter "mpstat 2 1 | ..." pour afficher les statistiques de la dernière seconde. Sinon, par défaut, mpstat affiche les statistiques depuis le début et cela ne change pas beaucoup au fil du temps
Sarang

1
"mpstat | awk '$ 12 ~ /[0-9..
AloneInTheDark

@Sarang Merci beaucoup !! Enfin, je peux également obtenir les résultats conkyaffichés. Malheureusement, cette ligne est TRÈS lente, prenant presque jusqu'à une seconde entière à exécuter.
syntaxerror

6
@syntaxerror Cela prend exactement 2 secondes car si vous regardez la commande, vous voyez que le premier argument est que c'est l'intervalle mais il ne s'exécute qu'une fois à cause du deuxième argument donc il attend 2 secondes complètes jusqu'à ce qu'il retourne le résultat.
Johan Bjäreholt

La question est fermée, alors j'ai ajouté ma réponse (similaire) à la vôtre :-) J'espère que cela ne vous dérange pas. Comme vous, j'ai été inspiré par la réponse de Peter Liljenberg.
PJ Brunet le

16

EDITED: J'ai remarqué que dans la réponse d'un autre utilisateur,% idle était le champ 12 au lieu du champ 11. Le awk a été mis à jour pour tenir compte du champ% idle étant variable.

Cela devrait vous donner le résultat souhaité:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

Si vous voulez un simple arrondi entier, vous pouvez utiliser printf:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'fonctionne très bien pour moi, merci. notez le mpstat 1 1 pour vous assurer que l'utilisation du processeur est échantillonnée sur une seconde
chrishiestand

1
Si vous avez jq:mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
nyet
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.