Echtzeit-CPU-Nutzung

9

Wenn ich folgenden Befehl ausführe, um CPU-Nutzung zu bekommen, bekomme ich nette + Benutzer-CPU-Nutzung.

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

Ausgabe:

14.5

Hier bekomme ich das Problem, dass die Ausgabe vom oberen Befehl abhängt und sich daher nicht sofort als oberster Befehl ändert. So bekomme ich nicht sofort die richtige CPU. Es gibt dieselbe Ausgabe und ändert sich nicht.

Ich möchte Echtzeit-CPU-Nutzung in der Ausgabe erhalten. Bitte helfen Sie mir, mein Kommando zu verbessern.

    
Ketankumar Patel 28.03.2013, 08:40

4 Antworten

16

Wenn Sie sich eine Verzögerung von einer Sekunde leisten können, wird die CPU-Auslastung als einfacher Prozentsatz ausgegeben:

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

(Ohne die Verzögerung von einer Sekunde kann vmstat nur den Durchschnitt drucken Werte seit dem Booten.)

    
Paul 21.05.2013 00:15
6

Dies ist ein bekanntes Problem mit top . Wie bereits hier erläutert, gibt die 1. Iteration von top -b die Prozentsätze seit dem Boot zurück, also brauchen wir mindestens zwei Iterationen ( -n 2 ), um den aktuellen Prozentsatz zu erhalten. Um die Dinge zu beschleunigen, können Sie d élay zwischen Iterationen auf 0.01 setzen. top teilt die CPU-Auslastung zwischen Benutzer, Systemprozesse und nice -Prozessen, wir wollen die Summe der drei. Schließlich geben Sie grep die Zeile mit den CPU-Prozentsätzen an und verwenden dann gawk , um Benutzer, System und nette Prozesse zu summieren:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print ++}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> 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 04.01.2014 14:18
6

Ich habe mehrere Möglichkeiten ausprobiert, aber das scheint mir am genauesten zu sein:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print (-+-)*100/(-+-+-)}'

Bekam es von hier

    
lepe 14.07.2015 10:11
0

Verwenden Sie -n2 . Dies wird zwei Zeilen ausgeben. Das erste Mal, dass top die Zeile druckt, qualifiziert sich nicht für den Status zu diesem Zeitpunkt. Passen Sie dann Ihr Skript an, um die erste Zeile zu ignorieren.

    
ilp 27.06.2013 15:55

Tags und Links