top -pid 3907 -stats "pid,command,cpu"
-pid 3907
: Ihre Prozess-ID
-stats pid,command,cpu
: Nur Prozess-ID, Name und CPU% anzeigen
Keine Notwendigkeit, awk
auf dem Ausgang zu laufen .
Wenn Sie die Ausgabe nachbearbeiten möchten, verwenden Sie diese Option, um -l 0
sie im Protokollierungsmodus auszuführen (0 bedeutet auf unbestimmte Zeit, alles andere begrenzt die Anzahl der Proben). Die Ausgabe sieht folgendermaßen aus (zwei Wiederholungen):
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads
2011/05/10 19:15:13
Load Avg: 0.14, 0.14, 0.09
CPU usage: 20.0% user, 26.66% sys, 53.33% idle
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16345 total, 1048M resident, 54M private, 338M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 750M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.
PID COMMAND %CPU
3907 WindowServer 0.0
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads
2011/05/10 19:15:14
Load Avg: 0.13, 0.14, 0.09
CPU usage: 0.95% user, 1.90% sys, 97.14% idle
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16346 total, 906M resident, 54M private, 386M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 751M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.
PID COMMAND %CPU
3907 WindowServer 2.7
Verwenden Sie awk
ein ähnliches Werkzeug, um nur jede 13. Zeile anzuzeigen (da diese Zeilen die Werte in diesem Beispiel enthalten):
$ top -l 0 -pid 3907 -stats pid,command,cpu | awk 'NR%13==0'
3907 WindowServer 0.0
3907 WindowServer 1.3
3907 WindowServer 2.2
# top -p1 -stats "pid,command,cpu" top: unknown option 't'
top
Linux unterscheidet.Dies kann sicherlich getan werden und ich werde erklären, wie ich es tun würde. Ich behaupte nicht, dass dies ein optimaler Ansatz ist, aber er macht den Job. Ich verwende Linux (und Bash-Shell), daher kann das Standardverhalten meines Tops etwas anders sein. Daher müssen Sie dieses Mini-Howto möglicherweise für Ihr spezielles Szenario anpassen.
Laufen Sie einfach oben ohne Argumente:
$ top
Hier ist der Header und eine relevante Zeile aus meiner Ausgabe:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2569 user 20 0 339m 86m 10m S 7.8 6.9 6:42.99 java
Ich habe einen Prozess aufgegriffen, der einige Zeit im Speicher bleibt und tatsächlich CPU verbraucht. Ich werde ihn als Testprozess verwenden, um das endgültige Ziel zu erreichen.
Standardmäßig wird top im interaktiven Modus ausgeführt. Das passt nicht zu mir, ich möchte die relevanten Daten erfassen und ausdrucken. Ich werde die Aufgabe übernehmen, die Daten danach interaktiv anzuzeigen. Relevante Zitate aus der Top-Manpage:
Dies ist der angepasste Befehl top, der die Ausgabe nur einmal druckt und dann beendet wird:
$ top -b -n 1
Ich kenne die PID, die ich sehen möchte, daher füge ich oben eine weitere Einschränkung hinzu, damit nur Daten über diesen Prozess gedruckt werden:
$ top -b -n 1 -p 2569
Selbst im Batch-Modus druckt top immer noch einen Header, der verschiedene systemweite Statistiken wie Verfügbarkeit, freien Speicher / Swap usw. enthält. Ich brauche das nicht. Alles, was ich brauche, ist nur eine Zeile - die, die Daten über meinen Prozess enthält, also schneide ich sie wie folgt aus der gesamten Ausgabe heraus:
$ top -b -n 1 -p 2569 | tail -n 2 | head -n 1
Wie Sie sehen können, habe ich die zweite Zeile von 1.
Ich werde diese Zeile an awk weiterleiten, um nur die Spalten zu extrahieren, die ich benötige:
$ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'
Bis jetzt habe ich diese Manipulationen in der Befehlszeile durchgeführt. Jetzt ist es an der Zeit, unserem fest codierten Sonderfall etwas Ausdauer und Flexibilität zu verleihen. Ich verschiebe die ganze Zeile in ein einfaches Shell-Skript. Ich werde es 3top nennen , der Name wird hervorgehoben, weil er später verwendet wird:
#!/bin/bash
top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'
Die PID-Nummer ist fest codiert. So können Sie das Skript dazu bringen, es als Befehlszeilenargument zu akzeptieren:
#!/bin/bash
top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'
Um 3top-Anzeigestatistiken für PID 2569 zu erstellen, muss dies folgendermaßen aufgerufen werden:
$ ./3top 2569
Ich möchte auch, dass der Prozentsatz nach der CPU-Auslastung angezeigt wird, also optimiere ich mein 3top-Skript wie folgt:
#!/bin/bash
out=$(top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}')
echo "$out%"
Ich habe die gesamte Ausgabe einer Befehlskette (über Pipes verbunden) in eine Variable umgeleitet. Dann drucke ich es einfach mit Echo und füge am Ende ein '%' hinzu, da die CPU-Auslastung das letzte Feld ist
Zu diesem Zeitpunkt habe ich ein Batch-Skript, das eine PID als Argument akzeptiert und Statistiken einmal druckt. Möchten Sie stattdessen Echtzeitüberwachung? Es ist einfach, weil die Uhr es kann! Führen Sie das Skript folgendermaßen aus:
$ watch -n 1 3top 2569
Es wird eine Echtzeitüberwachung durchführen, indem 3top einmal pro Sekunde ausgeführt wird.
quelle
top
. ungültige Option oder Syntax: -b . Keine Ahnung, warum dies wiederholt positiv bewertet wurde.top
(inprocps
) kann nicht mit Homebrew, MacPorts oder Fink installiert und nicht mitmake
oder aus dem Quellcode kompiliert werdencc top.c
.Das
top
Anzeigeformat ist anpassbar, es gibt jedoch keine Möglichkeit, Anzeigeoptionen in der Befehlszeile anzugeben. Wenn Sie jedoch erfinderisch sind, können Sie wahrscheinlich das tun, was Sie brauchen, indem Sie die~/.toprc
Datei geschickt manipulieren .Angenommen, Sie haben die Anzeige von noch nicht angepasst
top
(und haben keine~/.toprc
Datei):top
.*
Drücken Sie für jedes Feld, neben dem sich ein nicht gewünschtes Feld befindet , den entsprechenden Buchstaben, um die Auswahl dieses Felds aufzuheben. Drücken Sie beispielsweise, um edie Auswahl desUser Name
Felds aufzuheben . Wenn Sie fertig sind, sollten Sie nur eine haben*
nebenProcess Id
,CPU usage
undCommand name/line
.~/.toprc
Datei zu speichern.top
und starten Sie es erneut, um zu überprüfen, ob Ihre Einstellungen gespeichert sind.~/.toprc
es~/min.toprc
vor dem Start in etwas umtop
. Wenn Sie zum minimalen Layout wechseln möchten, benennen Sie~/min.toprc
es~/.toprc
vor dem Start wieder umtop
.Das Umbenennen und Starten dieser Datei
top
kann wahrscheinlich von jemandem mit einer Unze mehr Erfahrung und Wissen als ich in ein einfaches Shell-Skript eingearbeitet werden. Sie müssen besonders berücksichtigen, wenn Ihr regulärestop
Layout bereits angepasst wurde.quelle
.toprc
? Ich möchte den FilterRUID>999
beim Start hinzufügen .