2 votos

Cómo terminas todos los procesos llamados por un archivo de shell

Bien, así que tengo un dilema en el que he estado mirando por mucho tiempo. He probado la mayoría de las soluciones en línea, sino que simplemente no han funcionado muy bien...

Tengo un archivo shell. Vamos llamó "un". "a" se parece mucho a esto:

#a.sh

sh b.sh &
sh c.sh &

b.sh y c.sh parecerse mucho a esto:

#b.sh
run a process
run this opensource software over these files and wait
if condition; do
    sh e.sh
else
    f.sh
fi

Y luego c.sh:

#c.sh
call some other programs
call some python files
call these shell files
... etc

Por supuesto, f.sh y e.sh son similares y ejecutar sus propios procesos y esas cosas.

Ahora, como usted puede ver, cuando yo ejecute ".sh", se ejecuta una miríada de otras cosas. Me presione Ctrl+C, y los procesos que aún se están ejecutando en segundo plano. Yo cerca de la terminal; la misma cosa. Traté de matar con el ID, pero no sé cómo hacerlo para una gran cantidad de software de código abierto que estoy utilizando. En concreto, me han tratado de esta sugerencia, pero ¿cómo puedo hacer a.sh conocer los diferentes procesos que se ejecutan en el correo.sh y así sucesivamente, de manera que puede matarlos? Este no ha sido el trabajo que te diga.

Hay un comando que me permite terminar todos los procesos iniciados por un archivo de shell? Sé que esto es tan molesto, pero no puedo compartir el código que a partir de ahora. Si realmente me necesitas, me pueden enviar algo similar, pero de nuevo, mucho de lo que estoy haciendo es un software basado en ciertas condiciones y el software y los archivos de shell no se cierra cuando presiono Ctrl+C. Así que me veo obligado a pkill -U myuser, pero esto es poco práctico.

2voto

dessert Puntos 928

Si pstree $(pgrep a) listas de todos los descendiente de los procesos de a puede enviar SIGTERM a todos ellos (includig a.sh) con:

kill $(pstree -p $(pgrep "a.sh") | awk -F"[)(]" '{for(i=2;i<=NF;i+=2)print $i}')

Si ese no es el caso y tampoco lo kill -$(pgrep a) (aviso al -) ni pkill -P $(pgrep a) puede ayudar le sugiero que añadir una línea al principio de las secuencias de comandos y anexar su PID en un solo archivo como este:

echo $$ >>/path/to/the/pidfile

De esta manera usted siempre tiene una lista de PIDs disponible a matar con un simple:

kill </path/to/the/pidfile

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: