Wie kann ich den gesamten Prozessbaum, der von einem bestimmten Prozess erzeugt wurde, als Baum anzeigen lassen und nur diesen Baum, dh keine anderen Prozesse?
Die Ausgabe könnte zB so aussehen
4378 ? Ss 0:10 SCREEN
4897 pts/16 Ss 0:00 \_ -/bin/bash
25667 pts/16 S+ 0:00 | \_ git diff
25669 pts/16 S+ 0:00 | \_ less -FRSX
11118 pts/32 Ss+ 0:00 \_ -/bin/bash
11123 pts/32 S+ 0:00 \_ vi
Ich konnte nicht das gewünschte Ergebnis rein mit Parametern erzielen ps
.
Das Folgende gibt das gewünschte Ergebnis, scheint aber ein bisschen beteiligt zu sein:
#!/bin/bash
pidtree() {
echo -n $1 " "
for _child in $(ps -o pid --no-headers --ppid $1); do
echo -n $_child `pidtree $_child` " "
done
}
ps f `pidtree 4378`
Hat jemand eine einfachere Lösung?
ps auxf
.Antworten:
Das
pstree
ist eine sehr gute Lösung, aber es ist ein bisschen zurückhaltend. Ich benutzeps --forest
stattdessen. Aber nicht für aPID
(-p
), weil es nur den spezifischen Prozess ausgibt, sondern für die session (-g
). Es kann alle Informationenps
ausdrucken, die in einem ausgefallenen ASCII-Kunstbaum gedruckt werden können, der die-o
Option definiert.Also mein Vorschlag für dieses Problem:
Wenn der Prozess kein Sitzungsleiter ist, muss ein kleiner Trick angewendet werden:
Dies ruft zuerst die Sitzungs-ID (SID) des aktuellen Prozesses ab und ruft dann mit dieser Seite erneut ps auf.
Wenn die Spaltenüberschriften nicht benötigt werden, fügen Sie nach jeder Spaltendefinition ein '=' in die Optionen '-o' ein, wie zum Beispiel:
Ein Beispiellauf und das Ergebnis:
Leider funktioniert dies nicht,
screen
da es die Seite für jeden untergeordneten Bildschirm und alle Enkelkind-Bash festlegt.Damit alle Prozesse von einem Prozess erzeugt werden, muss der gesamte Baum erstellt werden. Ich habe awk dafür benutzt. Zunächst wird ein Hash-Array erstellt, das alle Elemente enthält
PID => ,child,child...
. Am Ende wird eine rekursive Funktion aufgerufen, um alle untergeordneten Prozesse eines bestimmten Prozesses zu extrahieren. Das Ergebnis wird an einen anderen übergeben,ps
um das Ergebnis zu formatieren. Die tatsächliche PID muss als Argument für awk geschrieben werden, anstatt<PID>
:Für einen SCREEN-Prozess (pid = 8041) sieht die Beispielausgabe folgendermaßen aus:
quelle
ps
eine Filter-Flag-Option vorhanden wäre, um nur nach allen Nachkommen einer PID zu filtern.Wo
${pid}
ist die PID des übergeordneten Prozesses.Unter Gentoo Linux
pstree
befindet sich im Paket "psmisc" anscheinend unterhttp://psmisc.sourceforge.net/quelle
pstree
ein ausführlicheres Ausgabeformat angeschaut habe , aber verpasst habe.pstree -p <pid>
Drucken Sie jedoch mindestens die Pids aus, die ziemlich nah sind.sed
alles .. mmm das funktioniert :)pstree -pn 4008 |grep -o "([[:digit:]]*)" |grep -o "[[:digit:]]*"
Hier ist meine Version, die sofort ausgeführt wird (da
ps
nur einmal ausgeführt). Funktioniert in bash und zsh.quelle
echo $1
in die erste for-Schleife verschoben und in geändert habeecho $i
.Ich habe ein kleines Bash-Skript erstellt, um eine Liste mit Pids der untergeordneten Prozesse eines Elternteils zu erstellen. Rekursiv, bis der letzte untergeordnete Prozess gefunden wird, der keine untergeordneten Prozesse enthält. Es gibt Ihnen keine Baumansicht. Es werden nur alle Pids aufgelistet.
Das erste Argument von list_offspring ist die übergeordnete pid
quelle
ps -H -g "$pid" -o comm
fügt keinen Baum per se hinzu, es ist nur die Liste der Prozesse.
gibt zum Beispiel
quelle
-H
Option wird ein Prozessbaum oder eine "Prozesshierarchie (Ich habe daran gearbeitet, eine Lösung für genau dasselbe Problem zu finden. Grundsätzlich dokumentiert ps manpage keine Option, die es erlaubt, mit einem einzigen Befehl das zu tun, was wir wollen. Fazit: Ein Skript wird benötigt.
Ich habe mir ein Skript ausgedacht, das Ihrem sehr ähnlich ist. Ich habe es in mein ~ / .bashrc eingefügt, damit ich es von jeder Shell aus verwenden kann.
quelle
Unterwegs auf der Kommandozeile:
es gibt aus:
eleganter Weg auf diese Weise ist es, eine Funktion zu definieren in
.bashrc
:dann auf der Kommandozeile ausführen:
quelle
Dies gibt nur die pid + children pids in einer Zeile an, was für die weitere Verarbeitung nützlich ist.
quelle
Ich habe ein ähnliches Drehbuch basierend auf dem obigen von Philippe erstellt
Dies gibt alle Kinder-, Enkelkinder- usw. Pids in einem durch Leerzeichen getrennten Format aus. Dies kann wiederum ps zugeführt werden, wie in
quelle
für alle Prozesse - pstree - eine Show von Benutzer - pstree Benutzer
quelle