¿Cómo puedo hacer que todo el árbol de procesos sea generado por un proceso dado que se muestra como un árbol y solo ese árbol, es decir, no hay otros procesos?
La salida podría, por ejemplo, verse como
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
No pude obtener el resultado deseado simplemente con parámetros para ps
.
Lo siguiente da el resultado deseado pero parece un poco complicado:
#!/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`
¿Alguien tiene una solución más fácil?
ps auxf
.Respuestas:
El
pstree
es una muy buena solución, pero es un poco reticente bits. Yo usops --forest
en su lugar. Pero no para aPID
(-p
) porque imprime solo el proceso específico, sino para la sesión (-g
). Puede imprimir cualquier información queps
pueda imprimir en un elegante árbol de arte ASCII que define la-o
opción.Entonces mi sugerencia para este problema:
Si el proceso no es un líder de sesión, entonces se debe aplicar un poco más de truco:
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:
Un ejemplo de ejecución y el resultado:
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 otrops
para formatear el resultado. El PID real debe escribirse como un argumento para awk en lugar de<PID>
:Para un proceso SCREEN (pid = 8041), el resultado de ejemplo se ve así:
fuente
ps
tuviera una opción de indicador de filtro solo para filtrar a todos los descendientes de un PID.donde
${pid}
está el pid del proceso padre.En Gentoo Linux,
pstree
está en el paquete "psmisc", aparentemente ubicado enhttp://psmisc.sourceforge.net/fuente
pstree
, pero me perdí un formato de salida más detallado. Sin embargo,pstree -p <pid>
al menos imprima los pids que estén razonablemente cerca.sed
todo eso ... mmm esto funciona :)pstree -pn 4008 |grep -o "([[:digit:]]*)" |grep -o "[[:digit:]]*"
Aquí está mi versión que se ejecuta instantáneamente (porque se
ps
ejecuta solo una vez). Funciona en bash y zsh.fuente
echo $1
dentro del primer bucle for y cambiándolo aecho $i
.He creado un pequeño script bash para crear una lista de pid de los procesos secundarios de un padre. Recurrentemente hasta que encuentre el último proceso hijo que no tiene ningún hijo. No te da una vista de árbol. Simplemente enumera todos los pid.
primer argumento de list_offspring es el padre pid
fuente
ps -H -g "$pid" -o comm
no agrega un árbol per se, es solo la lista de procesos.
da por ejemplo
fuente
-H
opción se utiliza para mostrar un árbol de procesos o "jerarquía de procesos (bosque)"He estado trabajando para encontrar una solución al mismo problema. Básicamente, ps manpage no documenta ninguna opción que permita hacer lo que queramos con un solo comando. Conclusión: se necesita un guión.
Se me ocurrió un guión muy similar al tuyo. Lo pegué en mi ~ / .bashrc para poder usarlo desde cualquier shell.
fuente
En camino en la línea de comandos:
produce:
La forma más elegante de esa manera es definir una función en
.bashrc
:luego en la línea de comando ejecutar:
fuente
Esto proporciona solo los pid hijos pid + cada uno en una línea, lo cual es útil para su posterior procesamiento.
fuente
Hice un guión similar basado en lo anterior de Philippe
Esto genera todos los pids secundarios, nietos, etc. en formato delimitado por espacios. Esto, a su vez, puede ser alimentado a ps, como en
fuente
para todo el proceso - pstree -a show by user - pstree user
fuente