digamos que tengo estoscript.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
cada vez 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
}
Intenté implementar esta característica usandotrap
trap exit_script SIGINT SIGTERM
La persona que respondió a mi pregunta demostró que estaba equivocado.
pero no funcionó porque trap
parece reaccionar solo a las señales enviadas a procesos secundarios/subprocesos. Como principiante, no pude descifrar trap
la página de manual, por lo que probablemente me perdí la solución.
Supongo que eso es lo que hacen los programas "reales" como Chromium cuando los envías.SIGTERM
Dehttps://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, es posible que algunas no.
Respuesta1
trap
reacciona a las señales del proceso de llamada. Pero debes llamarlo antes de recibir la señal. Quiero decir, al comienzo de tu guión.
Además, si quieres usar kill -- -$$
, que envía la señal también a tu script, debes limpiar la trampa antes de ejecutar la matanza o terminarás con un infinito.matar y atraparbucle.
Por ejemplo:
#!/bin/bash
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
trap - SIGINT SIGTERM # clear the trap
kill -- -$$ # Sends SIGTERM to child/sub processes
}
trap exit_script SIGINT SIGTERM
echo "Some other text"
#other commands here
sleep infinity
Como se explica en los comentarios, el problema es que el script recibe la señal pero está esperando a que finalice el programa de suspensión antes de procesar la señal recibida. Por lo tanto, debes eliminar los procesos secundarios (el proceso de suspensión en este caso) para ejecutar la acción de captura. Puedes hacerlo con algo como lo siguiente:
kill -- -$(pgrep script.sh)
O como se indica en los comentarios:
killall -g script.sh