Wie kann ich den Prozessbaum einer Terminal-Shell einschließlich der untergeordneten Elemente anzeigen?

30

Wenn ein Skript über die Eingabeaufforderung gestartet wird, erzeugt die Shell einen Unterprozess für dieses Skript. Ich möchte diese Beziehung zwischen dem Prozess auf Terminalebene und seinen untergeordneten Elementen zeigen, die psin einer Ausgabe im Baumstil verwendet werden.
Wie kann ich das machen?

Was ich bisher ausprobiert habe

Datei: script.sh

#!/bin/bash

ps -f -p$1

Dann rufe ich das Skript über die Befehlszeile auf und übergebe die Prozess-ID der Terminal-Shell:

$ ./script.sh $$

Was ich will, ist so etwas

  • Shell-Prozess der obersten Ebene (Terminal)
  • ./script.sh
  • Prozess für den psBefehl selbst
USER    PID  [..]
ubuntu 123     -bash
ubuntu 1234    \_ bash ./script.sh
ubuntu 12345      \_ ps auxf 

Was ich bekomme ist:

  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash
the_velour_fog
quelle
2
Warum nicht benutzen pstree?
muru
@muru Ich habe versucht pstreeund konnte es nicht schaffen, eine aussagekräftige Ausgabe zu produzieren. Ich denke pstree $$, es wurde bash--pstreenicht genau das produziert , wonach ich gesucht habe.
the_velour_fog
Wie ist es nicht was du suchst? Sie haben das Skript ersetzt, und pswas erwarten Sie außer dem noch pstree?
muru
@muru du hast recht es ist technisch was ich wollte, aber zu minimal. dh woher weißt du sicher, welche Prozesse du ohne eine PID siehst, wie ps es zeigt, gibt es Tabelle aus?
the_velour_fog
4
pstree -p $$? Oder, wenn Sie mehr von der Kommandozeile anzeigen möchten, pstree -pa $$. Oder, wenn Sie alle übergeordneten Prozesse anzeigen möchten, die ausgeführt werden pstree -psa $$.
muru

Antworten:

30

Versuchen

# ps -aef --forest
root     114032   1170  0 Apr05 ?        00:00:00  \_ sshd: root@pts/4
root     114039 114032  0 Apr05 pts/4    00:00:00  |   \_ -bash
root      56225 114039  0 13:47 pts/4    00:00:16  |       \_ top
root     114034   1170  0 Apr05 ?        00:00:00  \_ sshd: root@notty
root     114036 114034  0 Apr05 ?        00:00:00  |   \_ /usr/libexec/openssh/sftp-server
root     103102   1170  0 Apr06 ?        00:00:03  \_ sshd: root@pts/0
root     103155 103102  0 Apr06 pts/0    00:00:00  |   \_ -bash
root     106798 103155  0 Apr06 pts/0    00:00:00  |       \_ su - postgres
postgres 106799 106798  0 Apr06 pts/0    00:00:00  |           \_ -bash
postgres  60959 106799  0 14:39 pts/0    00:00:00  |               \_ ps -aef --forest
postgres  60960 106799  0 14:39 pts/0    00:00:00  |               \_ more
Gilberto Lins
quelle
5
Die Frage beinhaltete, nach einem Prozessbaum zu suchen, der an einem bestimmten Prozess beginnt $1, ein Skript zu argumentieren oder $$den Baum an der aktuellen Shell zu betrachten ein bestimmter prozess?
Filbranden
23

Ich habe es gefunden, nachdem ich diese Superuser-Antwort gelesen und diesen Kommentar notiert habe

Aber nicht für eine PID (-p), weil sie nur den spezifischen Prozess ausgibt, sondern für die Sitzung (-g)

und experimentieren

ps f -g<PID>

Ergebnis

$ ./script.sh $$
  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash
 9906 pts/24   S+     0:00  \_ bash ./script.sh 14492
 9907 pts/24   R+     0:00      \_ ps f -g14492
the_velour_fog
quelle
3
von der man-seite:OUTPUT MODIFIERS: f ASCII-art process hierarchy (forest)
phyatt
1

Sie können den Befehl verwenden ps f -g <PID>und den Root-Prozess für Folgendes angeben PID:

#> ps f -g 0

PID TTY      STAT   TIME COMMAND
2 ?        S      0:00 [kthreadd]
3 ?        S      0:01  \_ [ksoftirqd/0]
7 ?        S      0:19  \_ [rcu_sched]
Richard J.
quelle
1

Versuche dies:

 $ ps -afx
  PID TTY      STAT   TIME COMMAND
    2 ?        S      0:00 [kthreadd]
    4 ?        I<     0:00  \_ [kworker/0:0H]
    6 ?        I<     0:00  \_ [mm_percpu_wq]
    7 ?        S      0:14  \_ [ksoftirqd/0]
    8 ?        I      0:34  \_ [rcu_sched]
    9 ?        I      0:00  \_ [rcu_bh]
   10 ?        S      0:00  \_ [migration/0]
   11 ?        S      0:00  \_ [watchdog/0]
Rutsche
quelle