El pstree
es una muy buena solución, pero es un poco reticente bits. Yo uso ps --forest
en su lugar. Pero no para a PID
( -p
) porque imprime solo el proceso específico, sino para la sesión ( -g
). Puede imprimir cualquier información que ps
pueda imprimir en un elegante árbol de arte ASCII que define la -o
opción.
Entonces mi sugerencia para este problema:
ps --forest -o pid,tty,stat,time,cmd -g 2795
Si el proceso no es un líder de sesión, entonces se debe aplicar un poco más de truco:
ps --forest -o pid,tty,stat,time,cmd -g $(ps -o sid= -p 2795)
Esto obtiene el ID de sesión (SID) del proceso actual primero y luego llama a ps nuevamente con ese sid.
Si los encabezados de columna no son necesarios, agregue un '=' después de cada definición de columna en las opciones '-o', como:
ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 2795)
Un ejemplo de ejecución y el resultado:
$ ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 30085)
27950 pts/36 Ss 00:00:00 -bash
30085 pts/36 S+ 00:00:00 \_ /bin/bash ./loop.sh
31888 pts/36 S+ 00:00:00 \_ sleep 5
Desafortunadamente, esto no funciona, screen
ya que establece el sid para cada pantalla secundaria y para todos los nietos.
Para obtener todos los procesos generados por un proceso, es necesario construir todo el árbol. Solía awk para eso. Al principio construye una matriz hash para contener todo PID => ,child,child...
. Al final, llama a una función recursiva para extraer todos los procesos secundarios de un proceso dado. El resultado se pasa a otro ps
para formatear el resultado. El PID real debe escribirse como un argumento para awk en lugar de <PID>
:
ps --forest $(ps -e --no-header -o pid,ppid|awk -vp=<PID> 'function r(s){print s;s=a[s];while(s){sub(",","",s);t=s;sub(",.*","",t);sub("[0-9]+","",s);r(t)}}{a[$2]=a[$2]","$1}END{r(p)}')
Para un proceso SCREEN (pid = 8041), el resultado de ejemplo se ve así:
PID TTY STAT TIME COMMAND
8041 ? Ss 0:00 SCREEN
8042 pts/8 Ss 0:00 \_ /bin/bash
8092 pts/8 T 0:00 \_ vim test_arg test_server
12473 pts/8 T 0:00 \_ vim
12972 pts/8 T 0:00 \_ vim
ps auxf
.