Begrenzen Sie die Ausgabe des Befehls TOP auf einen bestimmten Prozessnamen


81

Wenn Sie den Befehl top aufrufen, erhalten Sie alle laufenden Prozesse. Aber wie kann ich begrenzen die Ausgabe nur bis zu einem bestimmten Prozessnamen wie „Java“ ?

Ich habe dieses Top -l 2 | ausprobiert grep java aber auf diese Weise erhalten Sie nur Schnappschüsse und keine ständig aktualisierte Liste. Und top -l 0 | grep java ist nicht wirklich klar.


5
Leider gibt es bisher noch keine gültige Antwort, da -p & -b vom Befehl top von OS X nicht unterstützt werden .
Alex

Ich habe unten veröffentlicht, was vielleicht die erste OSX-Lösung ist - und das gerade noch rechtzeitig;)
Anti Earth

Antworten:


131

Ich bevorzuge Folgendes, damit ich top weiterhin interaktiv verwenden kann, ohne jedes Mal die Pids nachschlagen zu müssen, wenn ich es ausführe:

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 wünscht
  • sedist ein Stream-Editor und sed 's/,$//'wird hier verwendet, um das nachfolgende Komma zu entfernen

2
Die beste Antwort verbessert Dogbanes, sodass Sie den Namen tatsächlich eingeben können, anstatt viele PIDs einzufügen. (Und das ist SO)
Sabgenton

1
Ich würde dich mehrmals abstimmen, wenn ich könnte, das sollte wirklich die "akzeptierte" Antwort sein, denke ich.
Spuriousdata

6
Ich bekomme top: pid limit (20) exceeded. Gibt es überhaupt eine Grenze?
Celwell

7
@celwell, bitte versuchen Sie es top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//'). Hier werden Daten für bis zu den ersten 20 von zurückgegebenen PIDs angezeigt pgrep.
Acumenus

3
Ab Yosemite (oder früher?) Ist es -pidstatt -p.
Max

53

Suchen Sie die Pids der Prozesse, die Sie überwachen möchten, und verwenden Sie dann die -pOption, mit der Sie dem topBefehl eine Liste der 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.)


7
Auf dem Mac sollte es "top-pid ID" sein, aber der Java-Prozess kann mehrere unterschiedliche IDs haben, da es mehrere Java-Prozesse geben kann.
Alex

32

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


1
Funktioniert nicht auf Mac, da Mac BSD-Tools und keine GPL-Tools verwendet. Und es gibt einige Unterschiede. Ich nehme an, die "-b" -Version ähnelt "-l 0", aber auch der Header der Tabelle wird gedruckt?
Alex

29

Wenn Sie die Antwort von @ dogbane erweitern , können Sie alle PIDs für einen benannten Prozess abrufen, um pgrepFolgendes zu tun:

top -p "$(pgrep -d ',' java)"

2
Dies hat eine maximale Grenze von 20 Pids
mrP

top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
MrP

Du hast recht! man topsagt "Diese Option kann bis zu 20 Mal angegeben werden, oder Sie können eine durch Kommas getrennte Liste mit bis zu 20 Pids bereitstellen." Na verdammt.
10b0

6

Verwenden Sie den Befehl watch

watch -d 'top -n1 | grep mysql'

Sollte "watch --d" sein. Ich erhalte jedoch keine Ausgabe, wenn ich diesen Befehl ausführe.
Alex

-1 :: man watch" watch führt den Befehl wiederholt aus und zeigt seine Ausgabe und Fehler an "; es zeigt nicht , zur Zeit laufenden Prozesse wie toptut
sdaau

@AlexanderOrlov, hier gibt es keine besondere Magie. Verwenden Sie einfach top -n1 zum Drucken und Beenden und verwenden Sie watch, um es kontinuierlich zu überwachen.
Tszming

@sdaau, dein Kommentar ist für meine Antwort irrelevant, bitte antworte beim nächsten Mal genauer.
Tszming

1
Ich denke, wir sollten -b Optionen hinzufügen. watch -d 'top -b -n1 | grep mysql'
Reyes Yang

5

Mit der Antwort von 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 bei mir unter MacOS 10.12 (Sierra)


2

Ich habe mein Problem gelöst mit:

top -n1 -b | grep "Prozessname"

In diesem Fall: -n wird verwendet, um festzulegen, wie oft oben welcher Prozess ausgeführt wird,
und -b wird verwendet, um alle Pids anzuzeigen

Es verhindert Fehler wie: top: pid limit (20) überschritten


2

Der folgende Code aktualisiert alle 5 Sekunden eine Liste von Prozessen über den Befehl watch:

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



1

Angenommen, auf dem Server mit demselben Namen werden mehr als 20 Prozesse ausgeführt. Dies hilft nicht

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

Es wird versucht, eine Echtzeitausgabe von 20 Prozessen aufzulisten und bereitzustellen, bei denen wir gute Chancen haben, andere Prozesse zu verpassen, die mehr Ressourcen verbrauchen.

Ich bin immer noch auf der Suche nach einer besseren Option


0

Ein spezifischerer Fall, wie ich ihn eigentlich gesucht habe:

Für Java-Prozesse können Sie auch verwenden, jps -qwobei jps ein Tool von $ JAVA_HOME / bin ist und sich daher in Ihrem $ PATH befinden sollte.


0

Ich bin hierher gekommen, um unter OSX nach einer Antwort darauf zu suchen. Am Ende bekam ich mit Bash und Awk, was ich wollte:

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 ' ' $@)" '
        BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
        NR<=12 || ($1 in pids)
    ' >"$dump"
  done
}

Ich schleife oben im Protokollierungsmodus und filtere es mit awk, wobei ich aus der Ausgabe von pgrep ein assoziatives Array aufbaue. Awk druckt die ersten 12 Zeilen, wobei Zeile 12 die Spaltenüberschriften sind, und dann jede Zeile mit einer PID, die ein Schlüssel im Array ist. Die Dump-Datei wird für eine besser beobachtbare Schleife verwendet.


Unter OSX können Sie so etwas wie pgrep <Prozessname> verwenden. top -pid <pid_specified_by_pgrep>
bergercookie

0

Ich top -bn 1 | grep javawerde nur den Trick für dich tun


0

Wenn Sie Folgendes ausführen, wird die Konsole kontinuierlich aktualisiert:

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

Hier ist die einzige Lösung für MacOS:

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

Dies wird jedoch unerwünscht gemeldet, invalid option or syntax: -pidwenn keine javaProzesse aktiv sind.

ERLÄUTERUNG

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

Zunächst erhalten wir die Liste der Prozess-IDs mit dem Prozessnamen "java":

pgrep java

und wir awkleiten dies weiter, was die Ergebnisse mit einem Begrenzer verbindet" -pid "

| awk 'ORS=" -pid "'

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

Wir verwenden dann nur sed, um die letzten 6 Zeichen des Begrenzers zu rasieren.

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

Wir sind bereit, die Ergebnisse weiterzuleiten an top:

top -pid `...`

0

Holen Sie sich PID des Prozesses:

# pidof <process>

Sagen Sie oben, welche Prozess-PIDs angezeigt werden sollen

# top -p <pid1>,<pid2>, etc

Beispiel:

landis@linux-e6510:~>pidof konsole
1841 1709
landis@linux-e6510:~>top -p 1841,1709

Oben werden nur die 2 Konsolenprozesse angezeigt. Dies ist auf einem ausgelasteten Server über ssh nützlich, da keine Weiterleitung durch grep erforderlich ist.


Entschuldigung, ich habe das fragliche Macos-Tag nicht gesehen. meins funktioniert auf allen meinen Linux-Boxen.
Landis Reed

-1

Verwenden Sie den in der Antwort von Rick Byers erwähnten Ansatz:

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

Es wurden jedoch mehr als 20 Prozesse ausgeführt, sodass das Befolgen des Befehls für jemanden hilfreich sein kann, der auf eine ähnliche Situation stößt.

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

pgrepRuft die Liste der Prozesse mit dem angegebenen Namen ab - in diesem Fall Java. headwird verwendet, um die ersten 20 Pids zu erhalten, da top bei Verwendung des Arguments -p nicht mehr als 20 Pids verarbeiten kann. pasteVerbindet schließlich die Liste der Pids mit ','.

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

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.