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.
Antworten:
Ich bevorzuge Folgendes, damit ich top weiterhin interaktiv verwenden kann, ohne jedes Mal die Pids nachschlagen zu müssen, wenn ich es ausführe:
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 sindtr "\\n" ","
übersetzt diese Zeilenumbrüche in Kommas, da top eine durch Kommas getrennte Liste von Prozess-IDs wünschtsed
ist ein Stream-Editor undsed 's/,$//'
wird hier verwendet, um das nachfolgende Komma zu entfernenquelle
top: pid limit (20) exceeded
. Gibt es überhaupt eine Grenze?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 angezeigtpgrep
.-pid
statt-p
.Suchen Sie die Pids der Prozesse, die Sie überwachen möchten, und verwenden Sie dann die
-p
Option, mit der Sie demtop
Befehl eine Liste der Pids bereitstellen können .Beispiel:
(Ich glaube, Sie können auch eine durch Kommas getrennte Liste übergeben.)
quelle
wie wäre es mit top -b | grep java
quelle
Wenn Sie die Antwort von @ dogbane erweitern , können Sie alle PIDs für einen benannten Prozess abrufen, um
pgrep
Folgendes zu tun:quelle
top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
man top
sagt "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.Verwenden Sie den Befehl watch
quelle
man watch
" watch führt den Befehl wiederholt aus und zeigt seine Ausgabe und Fehler an "; es zeigt nicht , zur Zeit laufenden Prozesse wietop
tutwatch -d 'top -b -n1 | grep mysql'
Mit der Antwort von hier konnte ich einen Einzeiler erstellen
Dies funktioniert bei mir unter MacOS 10.12 (Sierra)
quelle
Ich habe mein Problem gelöst mit:
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
quelle
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/,$//')
quelle
Ich führe es aus (zB):
top -b | egrep -w 'java|mysqld'
quelle
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
quelle
Ein spezifischerer Fall, wie ich ihn eigentlich gesucht habe:
Für Java-Prozesse können Sie auch verwenden,
jps -q
wobei jps ein Tool von $ JAVA_HOME / bin ist und sich daher in Ihrem $ PATH befinden sollte.quelle
Ich bin hierher gekommen, um unter OSX nach einer Antwort darauf zu suchen. Am Ende bekam ich mit Bash und Awk, was ich wollte:
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.
quelle
Ich
top -bn 1 | grep java
werde nur den Trick für dich tunquelle
Wenn Sie Folgendes ausführen, wird die Konsole kontinuierlich aktualisiert:
quelle
Hier ist die einzige Lösung für MacOS:
Dies wird jedoch unerwünscht gemeldet,
invalid option or syntax: -pid
wenn keinejava
Prozesse aktiv sind.ERLÄUTERUNG
Die anderen hier veröffentlichten Lösungen verwenden das Format
top -p id1,id2,id3
, aber MacOStop
unterstützt nur das unhandliche Formattop -pid id1 -pid id2 -pid id3
.Zunächst erhalten wir die Liste der Prozess-IDs mit dem Prozessnamen "java":
und wir
awk
leiten dies weiter, was die Ergebnisse mit einem Begrenzer verbindet" -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.Wir sind bereit, die Ergebnisse weiterzuleiten an
top
:quelle
Holen Sie sich PID des Prozesses:
Sagen Sie oben, welche Prozess-PIDs angezeigt werden sollen
Beispiel:
Oben werden nur die 2 Konsolenprozesse angezeigt. Dies ist auf einem ausgelasteten Server über ssh nützlich, da keine Weiterleitung durch grep erforderlich ist.
quelle
Verwenden Sie den in der Antwort von Rick Byers erwähnten Ansatz:
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.
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 bei Verwendung des Arguments -p nicht mehr als 20 Pids verarbeiten kann.paste
Verbindet 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 20
Teil ignorieren, wenn die Anzahl Ihrer Prozesse mit dem angegebenen Namen weniger als 20 beträgt.quelle