Reenviar SIGTERM al niño en Bash

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 ).

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım