linux - picard - Caminando un árbol de proceso
musicbrainz picard español (3)
Su primer paso es conectar ps a través de awk y grep. Al usar awk, puede aislar el campo ''this process PID'' o el ''parent process PID''.
O bien, dé un paseo por el sistema de archivos / proc.
Tengo el siguiente escenario.
El usuario escribiría el PID de un proceso y el script debería mostrar el proceso y sus subprocesos, subprocesos (y demás) de PID, y debería enumerarlo en un formato de árbol.
Intenté usar pstree PID
y ps faux PID
, pero no funciona. Parece que no toma PID de procesos como argumentos.
Alguna idea, por favor?
Este es el script bash que usa solo ps y awk . Puede usar at como base para generar árbol de procesos.
ppid=$1
while true
do
forloop=FALSE
# get all children by pid
for i in `ps -ef | awk ''$3 == ''$ppid'' {print $2}''`
do
# Here you have one of of the elements of tree
# parent -> child
echo $ppid - $i
forloop=TRUE
done
ppid=$i
if [ "$forloop" = "FALSE" ]; then
exit
fi
done
Solo quería documentar mis pasos relacionados con este problema.
Digamos que ejecuto esto en una terminal:
~$ echo "read -p ''Press Enter''" > mytest.sh
~$ chmod +x mytest.sh
~$ bash -c bash
~$ bash -c ./mytest.sh
... y dejarlo esperando en el mensaje de entrada de read
. Entonces, siempre puedo encontrar el pid de mytest.sh
como:
$ ps axf | grep mytest
20473 pts/2 S+ 0:00 | | /_ grep --color=tty mytest
20308 pts/5 S+ 0:00 | | /_ bash -c ./mytest.sh
... sin embargo, me gustaría generar un árbol ps axf
limitado a algunos padres de mytest.sh
; mirando un ps axf
completo, podemos ver una jerarquía:
$ ps axf
1489 ? Sl 1:39 /_ gnome-terminal --sm-client-id 106ab86
1511 ? S 0:00 | /_ gnome-pty-helper
...
20238 pts/5 Ss 0:00 | /_ bash
20274 pts/5 S 0:00 | | /_ bash
20308 pts/5 S+ 0:00 | | /_ bash -c ./mytest.sh
...
Entonces, digamos que no quiero ''escanear'' el gnome-terminal
(1489) como padre, sino que quiero comenzar en bash
(20238) .. Entonces, me gustaría obtener este resultado:
$ ps f -p 20238 20274 20308
PID TTY STAT TIME COMMAND
20238 pts/5 Ss 0:00 bash
20274 pts/5 S 0:00 /_ bash
20308 pts/5 S+ 0:00 /_ bash -c ./mytest.sh
... excepto que no quiero copiar / pegar los PID secundarios manualmente :)
Podría usar pstree
:
$ pstree -a -p 20238
bash,20238
└─bash,20274
└─bash,20308 -c ./mytest.sh
$ pstree -p 20238
bash(20238)───bash(20274)───bash(20308)
... desafortunadamente, la salida no es exactamente la misma que en ps axf
, que prefiero.
Entonces, puedo usar pstree
simplemente para obtener PIDs secundarios:
$ pstree -p 20238 | sed ''s/(//n(/g'' | grep ''('' | sed ''s/(/(.*/)).*//1/''
20238
20274
20308
$ pstree -p 20238 | sed ''s/(//n(/g'' | grep ''('' | sed ''s/(/(.*/)).*//1/'' | tr "/n" ,
20238,20274,20308,
y luego usarlos para obtener un árbol ps axf
, basado solo en el PID del padre:
$ ps f -p $(pstree -p 20238 | sed ''s/(//n(/g'' | grep ''('' | sed ''s/(/(.*/)).*//1/'' | tr "/n" " ")
PID TTY STAT TIME COMMAND
20238 pts/5 Ss 0:00 bash
20274 pts/5 S 0:00 /_ bash
20308 pts/5 S+ 0:00 /_ bash -c ./mytest.sh
Bueno, espero que esto ayude a alguien,
¡Aclamaciones!