2011-06-08 7 views
9

Mis scripts cdist-deploy-to y cdist-mass-deploy (desde cdist configuración de administración) se ejecutan de forma interactiva (es decir, son llamados por un usuario).Cómo matar a todos los hijos del shell actual en la interrupción?

Estos scripts llaman un montón de guiones, que a su vez llama a algunos scripts:

cdist-mass-deploy ... 
    cdist-deploy-to ... 
     cdist-explorer-run-global ... 
      cdist-dir .... 

Lo que quiero es para salir/matar a todos los scripts, tan pronto como cdist masa de implementar o bien se detuvo por control C (SIGINT) o asesinado con SIGTERM.

cdist-deploy-to también se puede llamar de forma interactiva y debe mostrar el mismo comportamiento.

El uso de las variantes ps -ef ... y co para descubrir todos los procesos con el ppid parece que podría ser bastante poco práctico. ¡Usando $! no funciona, ya que en los niveles más profundos, los niños no son procesos en segundo plano.

He intentado utilizar el siguiente código:

__cdist_kill_on_interrupt() 
{ 
    __cdist_tmp_removal 
    kill 0 
    exit 1 
} 

trap __cdist_kill_on_interrupt INT TERM 

Pero esto lleva a los mensajes dados de baja feos, así como a un error de segmentación en las conchas (guión, golpe, zsh) y parece no dejar todo al instante de todos modos:

# cdist-mass-deploy -p ikq04.ethz.ch ikq05.ethz.ch 
core: Waiting for cdist-deploy-to jobs to finish 
^CTerminated 
Terminated 
Terminated 
Terminated 
Segmentation fault 

Entonces la pregunta es, cómo salir limpiamente incluyendo todos los niños (sub) de una manera portátil (shell Bourne, no hay soporte CSH necesario)?

+1

+1. Pero estoy un poco preocupado por discutir el infanticidio. – Hyperboreus

Respuesta

1

No necesita manejar^C, que dará como resultado que se envíe una señal a todo el grupo de procesos, lo que matará a todos los procesos que no estén en segundo plano. Entonces no necesitas atrapar INT.

La única razón por la que obtiene un Terminated cuando los mata es que kill envía TERM por defecto, pero eso es razonable si está manejando un TERM en primer lugar. Puede usar kill -INT 0 si desea evitar los mensajes.

(respondiendo con información adicional)

Si los procesos hijos se ejecutan en segundo plano, puede obtener sus identificadores de proceso justo después de que los inician, utilizando el $! variable de shell especial. Reúnalos en una variable y simplemente mátalos cuando necesites terminar.

+1

¡Muchas gracias! Pero, ¿qué pasa con los procesos que están en segundo plano? cdist-mass-deploy inicia una gran cantidad de procesos de despliegue cdist, que están en segundo plano y esperando el uso de 'wait'. – Nico

Cuestiones relacionadas