it-swarm.com.de

Begrenzen Sie die Ausgabe des Befehls TOP auf einen bestimmten Prozessnamen

Wenn Sie den Befehl top aufrufen, erhalten Sie alle laufenden Prozesse. Aber wie kann ich limit nur die Ausgabe zu einem bestimmten Prozessnamen wie "Java" _?

Ich habe es ausprobiert. top -l 2 | grep Java Sie erhalten jedoch nur Snapshots und keine ständig aktualisierte Liste. Und top -l 0 | grep Java ist nicht wirklich klar.

76
Alex

Ich bevorzuge die folgenden, damit ich top immer noch interaktiv nutzen kann, ohne jedes Mal die Pids nachschlagen zu müssen, wenn ich es ausführen:

top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`

Wenn sich die Prozesse ändern, müssen Sie den Befehl natürlich erneut ausführen.

Erläuterung:

  • pgrep process-name gibt eine Liste von Prozess-IDs zurück, die durch Zeilenumbrüche getrennt sind
  • tr "\\n" "," übersetzt diese Zeilenumbrüche in Kommas, da top eine durch Kommas getrennte Liste von Prozess-IDs benötigt
  • sed ist ein Stream-Editor, und sed 's/,$//' wird hier verwendet, um das nachfolgende Komma zu entfernen
127
Rick Byers

Suchen Sie die Pids der Prozesse, die Sie überwachen möchten, und verwenden Sie dann die Option -p, mit der Sie dem Befehl top eine Liste mit Pids bereitstellen können.

Beispiel:

top -p 18884 -p 18892 -p 18919

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
18884 user  25   0  672M  95M  9476 S     0.0  1.1   0:02   1 Java
18892 user  25   0 2280M 123M 12252 S     0.0  1.5   0:05   1 Java
18919 user  22   0 1492M 198M 28708 S     0.0  2.4   0:07   1 Java

(Ich glaube, Sie können auch eine durch Kommas getrennte Liste übergeben.)

53
dogbane

wie wäre es mit top -b | grep Java

31
Faisal Feroz

Wenn Sie die Antwort auf @ dogbane erweitern, können Sie mit pgrep alle PIDs für einen benannten Prozess abrufen, um Folgendes auszuführen:

top -p "$(pgrep -d ',' Java)"
28
l0b0

Verwenden Sie den Befehl watch

watch -d 'top -n1 | grep mysql'
6
tszming

Ich führe es aus (zB): top -b | egrep -w 'Java|mysqld'

3

Mit der Antwort aus hier konnte ich einen Einzeiler erstellen

top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')

Dies funktioniert für mich unter MacOS 10.12 (Sierra)

3
bcjenkins

Der folgende Code aktualisiert alle 5 Sekunden eine Liste der Prozesse über den Befehl watch:

watch -n 5 -t top -b -n 1 -p$(pgrep Java | head -20 | tr "\\n" "," | sed 's/,$//')

2
gnod

Ich habe mein Problem gelöst mit: 

top -n1 -b | grep "Prozessname" 

in diesem Fall wird mit: - n festgelegt, wie oft oben welcher Prozess ausgeführt wird
und -b werden verwendet, um alle Pids anzuzeigen 

es verhindert Fehler wie: top: PID-Limit (20) überschritten

2
Markomafs

Angenommen .. Wenn auf dem Server mehr als 20 Prozesse mit demselben Namen ausgeführt werden, kann dies nicht helfen 

top -p pgrep Oracle | head -n 20 | tr "\\n" "," | sed 's/,$//' 

Es wird versucht, eine Liste der Echtzeitprozesse von 20 Prozessen zu erstellen, bei denen wir gute Chancen haben, andere Prozesse zu verpassen, die mehr Ressourcen benötigen.

Ich suche immer noch nach einer besseren Option 

1
user3482072

Wenn Sie das Folgende ausführen, erhalten Sie ein kontinuierliches Update in der Konsole:

bcsmc2rtese001 [~]$ echo $Shell  
/bin/bash  
bcsmc2rtese001 [~]$ top | grep efare  or watch -d 'top | grep efare' or top -p pid
27728 efare     15   0 75184 3180 1124 S  0.3  0.0 728:28.93 tclsh  
27728 efare     15   0 75184 3180 1124 S  0.7  0.0 728:28.95 tclsh
0

nur top -bn 1 | grep Java macht den Trick für Sie

0
Guru

Verwenden Sie den in der Antwort von Rick Byers genannten Ansatz:

top -p `pgrep Java | paste -sd "," -`

ich hatte jedoch mehr als 20 Prozesse ausgeführt, sodass der folgende Befehl für jemanden hilfreich sein kann, der eine ähnliche Situation hat.

top -p `pgrep Java | head -n 20 | paste -sd "," -`

pgrep ruft die Liste der Prozesse mit dem angegebenen Namen ab - in diesem Fall Java. head wird verwendet, um die ersten 20 Pids zu erhalten, da top mit -p Argument nicht mehr als 20 Pids verarbeiten kann. Schließlich verbindet paste die Liste der Pids mit ','.

Sie können den Prozessnamen, den Sie suchen, im obigen Befehl und die Anzahl der Prozesse mit diesem Namen, die Sie überwachen möchten, steuern. Sie können den head -n 20-Teil ignorieren, wenn die Anzahl Ihrer Prozesse mit dem angegebenen Namen weniger als 20 beträgt.

0
shaffooo

Ich bin hierher gekommen und habe auf OSX nach der Antwort darauf gesucht. Am Ende bekam ich was ich wollte mit bash und awk:

topfiltered() {
  [[ -z "$1" ]] && return
  dump="/tmp/top_dump"
  rm -f "$dump"
  while :; do
    clear
    [[ -s "$dump" ]] && head -n $(( $LINES - 1 )) "$dump"
    top -l 1 -o cpu -ncols $(( $COLUMNS / 8 )) | awk -v p="$(pgrep -d ' ' [email protected])" '
        BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
        NR<=12 || ($1 in pids)
    ' >"$dump"
  done
}

Ich schlaufe im Protokollierungsmodus eine Schleife und filte sie mit awk, wobei aus der Ausgabe von pgrep ein assoziatives Array erstellt wird. Awk gibt die ersten 12 Zeilen aus, wobei Zeile 12 die Spaltenüberschriften und dann jede Zeile, die eine PID enthält, ein Schlüssel im Array ist. Die Dump-Datei wird für eine beobachtbare Schleife verwendet.

0
aktivb

Ein speziellerer Fall, nach dem ich eigentlich gesucht habe: 

Für Java-Prozesse können Sie auch jps -q verwenden, wobei jps ein Werkzeug aus $ Java_HOME/bin ist und daher in Ihrem $ PATH enthalten sein sollte.

0
Alex

Hier ist die only -Lösung für MacOS:

top -pid `pgrep Java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`

dies wird jedoch in unerwünschter Weise invalid option or syntax: -pid melden, wenn keine Java-Prozesse aktiv sind.

ERKLÄRUNG

Die anderen hier veröffentlichten Lösungen verwenden das Format top -p id1,id2,id3, aber MacOS 'top unterstützt nur das unhandliche Format top -pid id1 -pid id2 -pid id3.

Als erstes erhalten wir die Liste der Prozess-IDs, die den Prozessnamen "Java" haben:

pgrep Java

und wir leiten dies an awk weiter, der die Ergebnisse mit dem Trennzeichen " -pid " verbindet

| awk 'ORS=" -pid "'

Leider hinterlässt dies einen abschließenden Begrenzer! Zum Beispiel haben wir bisher möglicherweise die Zeichenfolge "123 -pid 456 -pid 789 -pid " erhalten.

Wir verwenden dann einfach sed, um die letzten 6 Zeichen des Begrenzers zu entfernen.

| sed 's/.\{6\}$//'`

Wir sind bereit, die Ergebnisse an top weiterzuleiten:

top -pid `...`
0
Anti Earth