Wie kann ich ps
nur Benutzerprozesse und keine Kernel-Threads anzeigen lassen?
Sehen Sie diese Frage, um zu sehen, was ich meine ...
Wie kann ich ps
nur Benutzerprozesse und keine Kernel-Threads anzeigen lassen?
Sehen Sie diese Frage, um zu sehen, was ich meine ...
Dies sollte (unter Linux) tun:
ps --ppid 2 -p 2 --deselect
kthreadd
(PID 2) hat PPID 0 ( unter Linux 2.6+ ), ps
erlaubt jedoch kein Filtern nach PPID 0; also diese umgehung.
kthreadd
immer PID 2 ist?kthreadd
, dann baue den entsprechendenps
Aufruf auf. Wie sicher ist es, dass dieses Ding "immer" "kthreadd" heißt? Eine sichere Lösung wäre komplizierter, würdeps
normal ablaufen und die Ausgabe analysieren, möglicherweise einige Tests durchführen.x
Flagge ist, die damit nicht funktioniert.ps au --ppid 2 -p 2 --deselect
funktioniert okEine Möglichkeit, Kernel-Prozesse zu erkennen, besteht darin, dass sie keinen Benutzerspeicher verwenden. Das Feld vsz ist also 0. Dadurch werden auch Zombies (danke an Stephane Chazelas für diese Beobachtung) abgefangen , die basierend auf ihrem Status eliminiert werden können.
So listen Sie nur die PIDs auf:
quelle
In der Praxis habe ich folgende Redewendung gefunden:
Es filtert Zeilen, die mit eckigen Klammern enden, was dazu führen kann, dass unerwünschte Eingaben ausgelassen werden, aber es ist sehr unwahrscheinlich. Im Gegenzug ist es leicht zu merken und relativ schnell zu tippen.
Einige Prozesse wie avahi-daemon ergänzen ihre Prozessnameninformationen in Klammern (der Hostname im Fall von avahi-daemon) und werden von diesem Befehl herausgefiltert.
quelle
Eine Besonderheit dieser Prozesse ist, dass sie nicht durch eine ausführbare Datei gesichert werden. Sie können also Folgendes tun ( in zsh ):
Oder mit jeder POSIX-Shell:
Das heißt, es wird nach Prozessen gesucht, bei denen
/proc/<pid>/exe
es sich um einen Link zu einer Datei handelt.Das bedeutet aber, dass Sie Superuser sein müssen, um den Status des
/proc/<pid>/exe
Symlinks überprüfen zu können .Bearbeiten : In diesem Fall erfüllen die Zombie-Prozesse (zumindest) dieselbe Bedingung. Wenn Sie also nicht möchten, dass sie ausgeschlossen werden, müssen Sie sie erneut hinzufügen. Mögen:
Beachten Sie, dass
ps -f
diese Prozessnamen in eckigen Klammern angezeigt werden, nicht weil es sich um Kernelprozesse handelt, sondern weil sie leer sindargv[]
(daher zeigt ps den Prozessnamen stattargv[0]
dort an). Sie können einen User-Space-Prozess auch mit einem leerenargv[]
und einen Prozessnamen mit einemargv[0]
Formular haben,[some-string]
sodass das Filtern derps
Ausgabe anhand dieser eckigen Klammern keine narrensichere Option ist.quelle
zsh
Syntax. Die zweite ist die Standard-POSIX- Syntaxsh
(ps
undfind
undcut
undpaste
). Natürlich/proc
wird von POSIX nicht spezifiziert.wc -l
). Dann nehme ich die Antwort von Hauke Laging an und stimme Ihnen zu. ;)Sie können auch einfach die
ps
Ausgabe analysieren und nach Prozessnamen suchen, die nicht in Klammern stehen:quelle
awk -F: '$7 ~ home { print $1 }' /etc/passwd
- Es werden jedoch weiterhin Prozesse angezeigt, die einen solchen Benutzernamen erwähnen , und Sie lassen die temporäre Datei herumliegen. Ich werde meine Ablehnung zurückziehen, aber nur, weil Ihre dritte Lösung vernünftig ist.$NF
das letzte Wort der Befehlszeile in derps aux
Ausgabe ist. Nicht-Kernel-Prozesse können dort haben[...]
. Wie ich in meiner Antwort sagte, handelt es sich bei der[xxx]
Notation nicht um Kernelprozesse, sondern um eine Befehlszeile (kein Argument), die auch für Nicht-Kernelprozesse zulässig ist.Für alle, die dies in einer
ps
stark vereinfachten und anders ausgegebenen Busybox versuchen , ist diese Variante der großartigen Antwort von Gilles eine gute Wahl :Laut Gilles 'Antwort besteht die Methode darin, Prozesse zu finden, die keinen Benutzerspeicher verwenden (`vsz col == 0) und Zombie-Prozesse herauszufiltern (Status col ist nicht' Z ').
Ausgabespalten können einfach angepasst werden, solange die 1-basierten awk-Feldnummern entsprechend angepasst werden. Zeigen Sie die verfügbaren Optionen Ihres ps an, indem Sie einen falschen Wert eingeben. Zum Beispiel:
quelle
Wenn Sie nur die Anzahl benötigen ... Ich hatte ein ähnliches Bedürfnis, Kernel- und Benutzerprozesse zu filtern, aber ich brauchte jeweils nur die jeweilige Anzahl. Das war meine Lösung:
Beispielausgabe :
Erläuterung : Ich verwende den Hack, bei dem angenommen wird, dass VSZ = 0-Prozesse Kernelprozesse sind. Also mit
awk
, ich bewerte einen Vergleich über VSZ (vonps -eo vsize
), ob es gleich Null ist. Das Ergebnis des Vergleichs ist entweder eine boolesche 0 oder 1. Ich erstelle ein Arrayp[]
, und wenn ich die Liste der Prozesse durchlaufe, inkrementiere ich, wenn es sich um einen Kernelprozess handeltp[1]++
. Ansonsten inkrementiere ich als Benutzerprozessp[0]++
. Nach all dem Inkrementieren beschrifte und drucke ich die Werte (dh Zählwerte) für p [0] und p [1] imEND { }
Block.quelle
Was Sie suchen, mein Freund, ist nicht
ps
, aberpstree
.Ermitteln Sie zunächst den ersten Kernelprozess. Seine PID ist normalerweise 1 im System ohne systemd und 2 im Systemd.
Dann benutze diesen Befehl:
Die ausgewählte Antwort (eine mit ✅) verwendet einen anderen Befehl:
Das Problem bei diesem
ps
Befehl ist, dass nur direkte untergeordnete Elemente, aber nicht alle untergeordneten Elemente enthalten sind. Derpstree
Befehl enthält alle Nachkommen. Sie können die Ausgabe dieser beiden Befehle vergleichen und zählen (eine einfache Möglichkeit ist die Verwendung| wc
), um sie zu überprüfen.quelle