Executar comando ou função quando SIGINT ou SIGTERM for enviado para o próprio script pai, não para os processos filhos

Executar comando ou função quando SIGINT ou SIGTERM for enviado para o próprio script pai, não para os processos filhos

Digamos que eu tenho issoscript.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

Quero script.shexecutar a função exit_scriptsempre que receber SIGINTou SIGTERM Por exemplo:

killall script.sh # it will send SIGTERM to my script

e quero que meu script execute isso

exit_script() {
    echo "Printing something special!"
    echo "Maybe executing other commands!"
    kill -- -$$ # Sends SIGTERM to child/sub processes
}

Tentei implementar esse recurso usandotrap

trap exit_script SIGINT SIGTERM

A pessoa que respondeu à minha pergunta provou que eu estava errado.
mas não funcionou porque trapparece reagir apenas aos sinais enviados aos processos filhos/sub. Como iniciante, não consegui decifrar trapa página de manual, então provavelmente perdi a solução.

Acho que é isso que programas "reais" como o Chromium fazem quando você os enviaSIGTERM

Dehttps://major.io/2010/03/18/sigterm-vs-sigkill/

A aplicação pode determinar o que deseja fazer assim que um SIGTERM for recebido. Embora a maioria dos aplicativos limpe seus recursos e pare, alguns não.

Responder1

trapreage aos próprios sinais do processo de chamada. Mas você deve ligar antes que o sinal seja recebido. Quero dizer, no início do seu roteiro.

Além disso, se você quiser usar o kill -- -$$, que envia o sinal também para o seu script, você precisa limpar a armadilha antes de executar o kill ou terminará com um infinitomatar && armadilhalaço.

Por exemplo:

#!/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

Conforme explicado nos comentários, o problema é que o script recebe o sinal, mas aguarda o término do programa sleep antes de processar o sinal recebido. Portanto, você deve eliminar os processos filhos (o processo sleep, neste caso) para executar a ação trap. Você pode fazer isso com algo como o seguinte:

kill -- -$(pgrep script.sh)

Ou como afirmado nos comentários:

killall -g script.sh

informação relacionada