
Ich kann die gewünschten Filter im interaktiven Modus anwenden (durch Drücken von „o“). Gibt es eine Möglichkeit, diese im Batch-Modus zu erhalten?
Ich verwende procps-ng Version 3.3.10. Danke.
Antwort1
Entsprechenddie Manpage, die -p
Befehlszeilenoption kann verwendet werden, um einzuschränken, welche Prozesse top
lesen. Sie scheint keine exakt gleiche Filterung wie im interaktiven Modus zu ermöglichen, aber Sie können im Wesentlichen das gleiche Ergebnis erzielen, indem Sie die Ausgabe von untersuchen ps
.
Beispiel, das nur Prozesse mit mehr als drei Threads berücksichtigt:
$ ps -eLf | awk '$6 ~ /^[0-9]+$/ { if ($6 > 3) { print $2; } }' | sort -u
Auf meinem Computer wird dadurch eine Liste aller relevanten Prozesse ausgedruckt, einer in jeder Zeile. ps
generiert die Liste mit den Prozessdetails, der awk
Befehl filtert sie und sort
entfernt nur Duplikate.
Überprüfen Sie, welche Spalten ps
Sie für Ihren Gebrauch benötigen. Auf meinem Computer ist die Anzahl der Threads („NLWP“) die sechste Spalte ( $6
) und die Prozess-ID („PID“) die zweite Spalte ( $2
). Passen Sie diese im awk
Befehl nach Bedarf an, um den gewünschten Filter zu erhalten. Beachten Sie, dass dies $6
zweimal erscheint: zuerst, um sicherzustellen, dass es sich um eine Zahl und nicht um die Kopfzeile handelt, und das zweite Mal, um sicherzustellen, dass es mehr als 3 sind.
Nach dem Ausführen dieses Befehls müssen die Prozess-IDs an übergeben werden top
. Bash und wahrscheinlich auch andere Shells erlauben die Übergabe der Ausgabe eines Programms als Argumente an ein anderes Programm, sodass der endgültige Befehl lauten könnte:
$ top $(ps -eLf | awk '$6 ~ /^[0-9]+$/ { if ($6 > 3) { print "-p"$2; } }' | sort -u) ... And other options
"-p"
wurde hinzugefügt, damit die Ausgabe funktioniert top
. Passen Sie diesen Befehl bei Bedarf an Ihren Filter und Ihre Shell an, fügen Sie ihn in Ihren Batch ein, und er sollte funktionieren.
Hinweis: Um weitere Filter hinzuzufügen, müssen Sie wahrscheinlich Awk lernen. Es ist nicht allzu schwer.