¿Cómo puedo mostrar el árbol de procesos de un terminal shell, incluidos los hijos?

30

Cuando se inicia un script desde el símbolo del sistema, el shell generará un subproceso para ese script. Quiero mostrar esa relación entre el proceso de nivel terminal y sus hijos utilizando psen una salida de estilo de árbol.
¿Cómo puedo hacer esto?

Lo que he intentado hasta ahora

archivo: script.sh

#!/bin/bash

ps -f -p$1

Luego invoco el script desde la línea de comando que pasa el id del proceso del shell del terminal:

$ ./script.sh $$

Lo que quiero es algo como esto

  • proceso de shell de nivel superior (terminal)
  • ./script.sh
  • proceso para el pscomando en sí
USER    PID  [..]
ubuntu 123     -bash
ubuntu 1234    \_ bash ./script.sh
ubuntu 12345      \_ ps auxf 

lo que estoy obteniendo es:

  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash
the_velour_fog
fuente
2
¿Por qué no usar pstree?
Muru
@muru Lo intenté pstreey no pude lograr que produjera resultados significativos, creo que no pstree $$produjo bash--pstreeexactamente lo que estaba buscando.
the_velour_fog
¿Cómo no es lo que estás buscando? Has reemplazado el script y ps, entonces, ¿qué más esperas ver excepto pstree?
muru
@muru tu derecho es técnicamente lo que quería, pero demasiado mínimo. es decir, ¿cómo sabe con certeza qué procesos está mirando sin un PID como ps muestra la salida de la tabla?
the_velour_fog
44
pstree -p $$? O, si desea más de la línea de comando show pstree -pa $$,. O bien, si desea mostrar todos los procesos padre que suben, pstree -psa $$.
muru

Respuestas:

30

Tratar

# 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
fuente
55
La pregunta implicaba buscar un árbol de proceso que comenzara en un proceso específico, llevar un $1argumento a un script o usarlo $$para mirar el árbol que comienza en el shell actual ... ¿Puede actualizar su respuesta para incluir información sobre cómo obtener un bosque a partir de un proceso especifico?
filbranden
23

Lo encontré después de leer esta respuesta del superusuario , notando este comentario

Pero no para un PID (-p) porque imprime solo el proceso específico, sino para la sesión (-g)

y experimentando

ps f -g<PID>

resultado

$ ./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
fuente
3
desde la página de manual:OUTPUT MODIFIERS: f ASCII-art process hierarchy (forest)
phyatt
1

Puede usar el comando ps f -g <PID>y registrar el proceso raíz para 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.
fuente
1

Prueba esto:

 $ 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]
sluge
fuente