Befehl top -c unter Linux zum Filtern von Prozessen, die basierend auf dem Prozessnamen aufgelistet sind


149
top -c

Oben werden alle Prozesse aufgelistet. Es gibt gute Optionen zum Filtern der Prozesse nach Benutzername mithilfe der Option -u. Ich frage mich jedoch, ob es eine einfache Möglichkeit gibt, die Prozesse basierend auf dem Prozessnamen zu filtern, der in der Spalte BEFEHL der oberen Ausgabe aufgeführt ist.

Zum Beispiel möchte ich top -some option -substring von processname und top zeigt Pids an, deren Befehlsname nur diesen Teilstring enthält

Antworten:


213

Verwenden von pgrep, um PIDs übereinstimmender Befehlszeilen abzurufen:

top -c -p $(pgrep -d',' -f string_to_match_in_cmd_line)

top -perwartet eine durch Kommas getrennte Liste von Pids, die wir -d','in pgrep verwenden. Das -fFlag in pgrep stimmt mit der Befehlszeile anstelle des Programmnamens überein.


12
Denken Sie daran, dass neue Prozesse, die für 'string_to_match_in_cmd_line' erzeugt werden, nicht oben angezeigt werden. Sie
müssten

1
Wie Eugenevd sagte, funktioniert dies nicht für neue Prozesse, die nach dem Aufruf von top gestartet werden. Gibt es eine Möglichkeit dazu? Ich muss mehrere Programme mit demselben Präfix auf dem Namen ausführen, und ich würde gerne sehen, wie viele davon live ausgeführt werden, ohne jedes Mal ein neues Top (oder nur ein ps) ausführen zu müssen.
Jester

1
@ Jester, Eugenevd, ich hatte das gleiche Problem wie Sie. Ich habe eine neue Version unter stackoverflow.com/a/27653841/681830 erstellt , hoffe, das hilft.
Val

5
Ich bin darauf gestoßen, top: pid limit (20) exceededalso habe ich Folgendes verwendet : top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//').
f01

115

Dies kann interaktiv erfolgen

Nach dem Ausführen top -ctraf ound einen Filter auf eine Spalte schreiben, zB Zeilen zu zeigen , wo COMMAND Spalte den String foo enthält, SchreibCOMMAND=foo

Wenn Sie nur eine grundlegende Ausgabe wünschen, könnte dies ausreichen:

top -bc |grep name_of_process

6
Dies gibt mir 'ungültige Option oder Syntax: -bc'
shmim

3
top -bc -n 1 ist bequemer, da es die Anzahl der Iterationen auf 1 begrenzt.
Galath

1
Dies sollte die akzeptierte Antwort sein. Es ist genauer und funktioniert nur mit den Optionen, die mit dem Befehl 'top' bereitgestellt werden. Und es zeigt neue Prozesse.
Abraham TS

Die Prozesse verschwinden immer wieder und tauchen wieder auf top -c , hit o and write a filter on a column.
MrR

92

Sie können Filter hinzufügen, topwährend es ausgeführt wird. Drücken Sie einfach die oTaste und geben Sie einen Filterausdruck ein. Um beispielsweise alle Java-Prozesse zu überwachen, verwenden Sie den Filterausdruck COMMAND=java. Sie können mehrere Filter hinzufügen, indem Sie die Taste erneut drücken, Sie können mit der uTaste nach Benutzer filtern und Sie können alle Filter mit der =Taste löschen .


2
Dies ist eine bessere Lösung als die akzeptierte Antwort (diese Lösung wurde 3 Jahre später als das Original gestellt). Im Gegensatz zum Original funktioniert diese Lösung auch bei neu erzeugten Prozessen. Sehr wichtig, wenn Sie Apache-Prozesse überwachen, die bei Bedarf erstellt werden.
Nate Lampton

2
In der Tat eine bessere Lösung, weil es live filtert. Akzeptierte Lösung löst Prozess-IDs auf, bevor top ausgeführt wird. Der resultierende Prozess ist wie der top -c -p 920,1345,1346, der festgelegt ist.
Jérôme Gillard

4
Die Verwendung oals Filter ist in einigen (älteren) Versionen von top nicht vorhanden: Der top: procps version 3.2.8Benutzerfilter ist vorhanden, sodass dies funktioniert.
Manwe

13

@ perreal Befehl funktioniert super! Wenn Sie es vergessen, versuchen Sie es in zwei Schritten ...

Beispiel: Filter oben, um nur die Anwendung namens Yakuake anzuzeigen:

$ pgrep yakuake
1755

$ top -p 1755

nützliche top interaktive Befehle 'c': Umschalten des vollständigen Pfads gegenüber dem Befehlsnamen 'k': Töten nach PID 'F': Filtern nach ... Wählen Sie mit Pfeilen ... und drücken Sie dann 's', um die Sortierung festzulegen

Die Antwort unten ist auch gut ... Ich habe heute danach gesucht, konnte sie aber nicht finden. Vielen Dank


7

Nachdem ich auf StackOverflow nach so vielen Antworten gesucht habe, habe ich keine Antwort gefunden, die meinen Anforderungen entspricht.

Das heißt, Sie müssen den Befehl top ausführen, um die Aktualisierung mit dem angegebenen Schlüsselwort fortzusetzen, und wir müssen nicht immer wieder STRG + C / top drücken, wenn neue Prozesse erscheinen.

Also mache ich einen neuen ...

Hier geht die Version ohne Neustart.

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; sleep 1; done;)

Ändern Sie das Schlüsselwort __ und es sollte funktionieren. (Ubuntu 2.6.38 getestet)

2.14.2015 hinzugefügt: Der System-Workload-Teil fehlt mit dem obigen Code. Für Leute, die sich für den Teil "Lastdurchschnitt" interessieren:

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; uptime; sleep 1; done;)

Hier fehlt eine Übersicht über die Arbeitslast des Systems. Fügen Sie "Betriebszeit" vor dem Schlafengehen hinzu. Für kurze Prozesslisten ist dies meiner Meinung nach ausreichend.
Sevyls

1
@Sevyls Danke für den Hinweis! Nach einigen anderen Versuchen (die nicht so gut funktionieren wie) ist Ihre Version möglicherweise eine der besten. Antwort geändert.
Val

Funktioniert hervorragend, wenn ein oder mehrere Prozesse ausgeführt werden, die übereinstimmen, aber wenn alle angehalten werden, wird "top: Invalid user" angezeigt. Es wird wiederhergestellt, wenn ein anderer Prozess gestartet wird. Ich laufe auf Raspbian FYI. Vielen Dank.
Mike

1

was ist damit?

top -c -p <PID>

4
Wir versuchen, nach Prozessname (oder dessen Teilzeichenfolge) zu filtern. Wenn Sie Ihren Prozess neu starten, erhalten Sie eine neue PID.
Srujan Kumar Gulla

1

Am Ende habe ich ein Shell-Skript mit folgendem Code verwendet:

#!/bin/bash

while [ 1 == 1 ]
do
    clear
    ps auxf |grep -ve "grep" |grep -E "MSG[^\ ]*" --color=auto
    sleep 5
done

1

Die meisten Antworten schlagen hier fehl, wenn die Prozessliste 20 Prozesse überschreitet. Das ist top -pOptionslimit. Für diejenigen mit älterem Top, die das Filtern mit oOptionen nicht unterstützen , ist hier ein skriptfähiges Beispiel, um eine Vollbild- / Konsolenausgabe zu erhalten (zusammenfassende Informationen fehlen in dieser Ausgabe).

__keyword="YOUR_FILTER" ; ( FILL=""; for i in  $( seq 1 $(stty size|cut -f1 -d" ")); do FILL=$'\n'$FILL; done ;  while :; do HSIZE=$(( $(stty size|cut -f1 -d" ")  - 1 ));  (top -bcn1 | grep "$__keyword"; echo "$FILL" )|head -n$HSIZE; sleep 1;done )

Einige Erklärungen

__keyword = your grep filter keyword
HSIZE=console height
FILL=new lines to fill the screen if list is shorter than console height
top -bcn1 = batch, full commandline, repeat once

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.