Filterung der Ausgabe des obersten Befehls

12

Ich verwende einen Mac und möchte die Ausgabe des topBefehls für einen bestimmten Prozess so filtern, dass nur die Spalten PID, COMMAND und% CPU angezeigt werden.

Nachdem ich die PID des Prozesses erhalten habe, starte ich:

top -pid 1234

Dies zeigt jedoch mehr als 15 Spalten für diesen Prozess an. Kann ich die Ausgabe des Befehls an awk weiterleiten und nur Folgendes anzeigen:

PID COMMAND %CPU

Säulen?

Ich möchte die Ausgabe nicht in einer Textdatei speichern und dann verarbeiten. Ich bin daran interessiert, den Prozess in Echtzeit zu überwachen.

Smokinguns
quelle

Antworten:

8
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, awkauf dem Ausgang zu laufen .


Wenn Sie die Ausgabe nachbearbeiten möchten, verwenden Sie diese Option, um -l 0sie 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 awkein ä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 
Daniel Beck
quelle
# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg
@AstraSerg Funktioniert für mich. Beachten Sie, dass dies eine Mac OS-Frage ist, die sich von topLinux unterscheidet.
Daniel Beck
6

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.

  1. 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.

  2. 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:

    -b: Batch-Modus-Operation Startet oben im 'Batch-Modus', was nützlich sein kann, um Ausgaben von oben an andere Programme oder an eine Datei zu senden. In diesem Modus akzeptiert top keine Eingaben und wird ausgeführt, bis das mit der Befehlszeilenoption '-n' festgelegte Iterationslimit erreicht ist oder bis es beendet wird.

    -n: Anzahl der Iterationen begrenzt als: -n Anzahl Gibt die maximale Anzahl von Iterationen oder Frames an, die top vor dem Beenden erzeugen soll.

    Dies ist der angepasste Befehl top, der die Ausgabe nur einmal druckt und dann beendet wird:

    $ top -b -n 1

  3. 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

  4. 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.

  5. 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}'

  6. 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}'

  7. 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

  8. 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

  9. 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.

vtest
quelle
11
Der Benutzer ist unter OS X und hat kein Gnu top. ungültige Option oder Syntax: -b . Keine Ahnung, warum dies wiederholt positiv bewertet wurde.
Daniel Beck
5
Gnu top(in procps) kann nicht mit Homebrew, MacPorts oder Fink installiert und nicht mit makeoder aus dem Quellcode kompiliert werden cc top.c.
Daniel Beck
2

Das topAnzeigeformat 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 ~/.toprcDatei geschickt manipulieren .

Angenommen, Sie haben die Anzeige von noch nicht angepasst top(und haben keine ~/.toprcDatei):

  1. Starten top.
  2. Drücken Sie f, um den Feldauswahlmodus aufzurufen.
  3. *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 des User NameFelds aufzuheben . Wenn Sie fertig sind, sollten Sie nur eine haben *neben Process Id, CPU usageund Command name/line.
  4. Drücken Sie Space, um zum Hauptfenster zurückzukehren.
  5. Drücken Sie W(dh Shift+ w), um das aktuelle Layout in Ihrer ~/.toprcDatei zu speichern.
  6. Beenden Sie das Programm topund starten Sie es erneut, um zu überprüfen, ob Ihre Einstellungen gespeichert sind.
  7. Wenn Sie zum Standardlayout zurückkehren möchten, benennen Sie ~/.toprces ~/min.toprcvor dem Start in etwas um top. Wenn Sie zum minimalen Layout wechseln möchten, benennen Sie ~/min.toprces ~/.toprcvor dem Start wieder um top.

Das Umbenennen und Starten dieser Datei topkann 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äres topLayout bereits angepasst wurde.

William Jackson
quelle
Ist es möglich, einen Filter (auch manuell) hinzuzufügen .toprc? Ich möchte den Filter RUID>999beim Start hinzufügen .
Dr. Beco