Jak mogę wyświetlić drzewo procesów powłoki terminala, w tym dzieci?

30

Po uruchomieniu skryptu z wiersza poleceń powłoka odrodzi podproces dla tego skryptu. Chcę pokazać związek między procesem na poziomie terminala a jego elementami potomnymi używającymi psdanych wyjściowych w stylu drzewa.
W jaki sposób mogę to zrobić?

Co próbowałem do tej pory

plik: script.sh

#!/bin/bash

ps -f -p$1

Następnie wywołuję skrypt z wiersza poleceń, przekazując identyfikator procesu powłoki terminalu:

$ ./script.sh $$

Chcę czegoś takiego

  • proces powłoki najwyższego poziomu (terminal)
  • ./script.sh
  • proces pssamego polecenia
USER    PID  [..]
ubuntu 123     -bash
ubuntu 1234    \_ bash ./script.sh
ubuntu 12345      \_ ps auxf 

dostaję:

  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash
the_velour_fog
źródło
2
Dlaczego nie użyć pstree?
muru
@muru Próbowałem pstreei nie udało mi się uzyskać znaczącego wyniku, myślę, że pstree $$po prostu bash--pstreenie wyprodukowałem dokładnie tego, czego szukałem.
the_velour_fog
Jak to nie to, czego szukasz? Zastąpiłeś skrypt, a pswięc czego jeszcze oczekujesz oprócz pstree?
muru
@muru masz prawo to technicznie to, czego chciałem, ale zbyt minimalne. tzn. skąd wiesz na pewno, na które procesy patrzysz bez PID, np. ps pokazuje, że ma wynik tabeli?
the_velour_fog
4
pstree -p $$? Albo, jeśli chcesz więcej linii koncert polecenia pstree -pa $$. Albo, jeśli chcesz pokazać wszystkie procesy nadrzędne idzie w górę, pstree -psa $$.
muru

Odpowiedzi:

30

Próbować

# 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
LINIE GILBERTO
źródło
5
Pytanie sugerowało poszukiwanie drzewa procesów rozpoczynającego się od określonego procesu, $1argumentowania skryptu lub $$patrzenia na drzewo zaczynające się od bieżącej powłoki ... Czy możesz zaktualizować swoją odpowiedź, aby zawierała informacje o tym, jak uzyskać las, zaczynając od konkretny proces?
filbranden
23

Znalazłem to po przeczytaniu odpowiedzi superużytkownika , odnotowując ten komentarz

Ale nie dla PID (-p), ponieważ drukuje tylko określony proces, ale dla sesji (-g)

i eksperymentowanie

ps f -g<PID>

wynik

$ ./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
źródło
3
ze strony OUTPUT MODIFIERS: f ASCII-art process hierarchy (forest)
podręcznika
1

Możesz użyć polecenia ps f -g <PID>i statystyki procesu rootowania dla 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.
źródło
1

Spróbuj tego:

 $ 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]
wielki
źródło