Pregunta:
Tengo un script de Bash, que se parece a esto:
#!/bin/bash
echo "Doing some initial work....";
/bin/start/main/server --nodaemon
Ahora, si el shell bash que ejecuta el script recibe una señal SIGTERM, también debería enviar un SIGTERM al servidor en ejecución (que bloquea, por lo que no es posible una trampa). ¿Es eso posible?
Respuesta:
Tratar:
#!/bin/bash
_term() {
echo "Caught SIGTERM signal!"
kill -TERM "$child" 2>/dev/null
}
trap _term SIGTERM
echo "Doing some initial work...";
/bin/start/main/server --nodaemon &
child=$!
wait "$child"
Normalmente, bash
ignorará cualquier señal mientras se ejecuta un proceso hijo. Iniciar el servidor con &
lo trasladará al sistema de control de trabajos del shell, con $!
que contiene el PID del servidor (para usar con wait
y kill
). La llamada de wait
esperará a que finalice el trabajo con el PID especificado (el servidor) o que se active cualquier señal .
Cuando el shell recibe SIGTERM
(o el servidor sale de forma independiente), la llamada de wait
regresará (saliendo con el código de salida del servidor, o con el número de señal + 128 en caso de que se reciba una señal). Luego, si el shell recibió SIGTERM, llamará a la función _term
especificada como el manejador de trampas SIGTERM antes de salir (en la cual hacemos cualquier limpieza y propagamos manualmente la señal al proceso del servidor usando kill
).