Dejaré que el Almirante Ackbar responda a este.
#!/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.
Bien hecho ... +1 –
Rápido, macro de la imagen, _y_ la respuesta correcta? ** Comienza la votación ascendente. ** –
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? –