Digamos que tengo esto script.sh
#!/bin/bash
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
kill -- -$$ # Sends SIGTERM to child/sub processes
}
echo "Some other text"
#other commands here
sleep infinity
Quiero script.sh
ejecutar la función exit_script
siempre que reciba SIGINT
o SIGTERM
Por ejemplo:
killall script.sh # it will send SIGTERM to my script
y quiero que mi script ejecute esto
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
kill -- -$$ # Sends SIGTERM to child/sub processes
}
Traté de implementar esta característica usando trap
trap exit_script SIGINT SIGTERM
La persona que respondió mi pregunta demostró que estaba equivocado.
pero no funcionó porque trap
parece reaccionar solo a las señales enviadas a los procesos secundarios / secundarios. Como principiante no pude descifrar trap
la página de manual, así que probablemente me perdí la solución.
Supongo que eso es lo que hacen los programas "reales" como Chromium cuando los envías SIGTERM
Desde https://major.io/2010/03/18/sigterm-vs-sigkill/
La aplicación puede determinar qué quiere hacer una vez que se recibe un SIGTERM. Si bien la mayoría de las aplicaciones limpiarán sus recursos y se detendrán, algunas no.
Respuestas:
trap
reacciona al proceso de llamada se señala a sí mismo. Pero debe llamarlo antes de recibir la señal. Quiero decir, al comienzo de tu guión.Además, si desea usar
kill -- -$$
, que también envía la señal a su script, debe borrar la trampa antes de ejecutar kill o finalizará con un ciclo infinito kill && trap .Por ejemplo:
Como se explica en los comentarios, el problema es que el script recibe la señal pero está esperando que el programa de suspensión finalice antes de procesar la señal recibida. Por lo tanto, debe eliminar los procesos secundarios (el proceso de suspensión en este caso) para ejecutar la acción de captura. Puede hacerlo con algo como lo siguiente:
O como se indica en los comentarios:
fuente
./script.sh & sleep 1 && kill -- -$(pgrep script.sh)
enviar una señal de interrupción también a los procesos secundarios de su script.