Ejecutar comando o función cuando SIGINT o SIGTERM se envía al script principal, no a los procesos secundarios

Ejecutar comando o función cuando SIGINT o SIGTERM se envía al script principal, no a los procesos secundarios

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.shejecutar la función exit_scriptcada vez que reciba SIGINTo 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 trapparece reaccionar solo a las señales enviadas a procesos secundarios/subprocesos. Como principiante, no pude descifrar trapla 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

trapreacciona 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

información relacionada