2012-01-26 9 views
12

Me gustaría escribir una secuencia de comandos que ejecute varios comandos diferentes que se ejecutan de forma infinita, p. Ej.En Bash, ¿cómo puedo ejecutar múltiples comandos de ejecución infinita y cancelarlos todos con^C?

run_development_webserver.sh 
watch_sass_files_and_compile_them.sh 
watch_coffeescript_files_and_compile_them.sh 

me gustaría ejecutar cada una de ellas en paralelo, y matarlos a todos por golpear^C. ¿Es esto posible? De ser así, ¿cómo puedo hacer esto?

Respuesta

34

Dejaré que el Almirante Ackbar responda a este.

trap

#!/bin/bash -e 

run_development_webserver.sh & 
PIDS[0]=$! 
watch_sass_files_and_compile_them.sh & 
PIDS[1]=$! 
watch_coffeescript_files_and_compile_them.sh & 
PIDS[2]=$! 

trap "kill ${PIDS[*]}" SIGINT 

wait 

Esto comienza cada uno de sus comandos en el fondo (&), pone sus identificadores de proceso ($!) en una matriz (PIDS[x]=$!), dice bash-kill todos ellos (${PIDS[*]) cuando su script obtiene una señal SIGINT (Ctrl + C), y luego wait s para todos los procesos para salir.

Y mencionaré proactivamente que "kill ${PIDS[*]}" se expande PIDS al crear trap; si cambia las comillas dobles (") a comillas simples ('), se ampliará cuando se ejecute trap, lo que significa que puede agregar más procesos al PIDS después de configurar el trap y los matará también.

Si usted tiene un proceso terca que no quieren dejar de fumar después de un Ctrl +C (SIGINT), es posible que tenga que enviar una señal más fuerte matanza - SIGTERM o incluso SIGKILL (utilizar esto como una En última instancia, mata incondicionalmente el proceso sin darle la oportunidad de limpiarlo). En primer lugar, trate de cambiar la línea trap a esto:

trap "kill -TERM ${PIDS[*]}" SIGINT 

Si no responde a la SIGTERM, salvo que el proceso del PID por separado, por ejemplo en STUBBORN_PID, y usar esto:

trap "kill ${PIDS[*]}; kill -KILL $STUBBORN_PID" SIGINT 

Recuerde, este no permitirá que el proceso obstinado se limpie, pero si necesita morir y no lo es, es posible que deba usarlo de todos modos.

+0

Bien hecho ... +1 –

+3

Rápido, macro de la imagen, _y_ la respuesta correcta? ** Comienza la votación ascendente. ** –

+0

I + 1 porque esto parece ser la respuesta correcta en general. Sin embargo, uno de los scripts (en realidad, al iniciar Memcached no está en modo daemon) parece capturar el^C en sí y al intentar eliminarlo, falla. ¿Alguna idea de por qué esto podría ser? –

Cuestiones relacionadas