Digamos que eu tenho isso 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
Quero script.sh
executar a função exit_script
sempre que receber SIGINT
ou SIGTERM
Por exemplo:
killall script.sh # it will send SIGTERM to my script
e eu quero que meu script execute isso
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
kill -- -$$ # Sends SIGTERM to child/sub processes
}
Eu tentei implementar esse recurso usando trap
trap exit_script SIGINT SIGTERM
A pessoa que respondeu à minha pergunta me mostrou errada.
mas não funcionou porque trap
parece reagir apenas a sinais enviados a processos secundários / filhos. Como iniciante, não consegui decifrar trap
a página de manual do usuário, então provavelmente perdi a solução.
Acho que é isso que programas "reais" como o Chromium fazem quando você os envia SIGTERM
From https://major.io/2010/03/18/sigterm-vs-sigkill/
O aplicativo pode determinar o que deseja fazer quando um SIGTERM for recebido. Embora a maioria dos aplicativos limpe seus recursos e pare, outros podem não.
Respostas:
trap
reage ao próprio processo de chamada. Mas você deve chamá-lo antes que o sinal seja recebido. Quero dizer, no começo do seu roteiro.Além disso, se você deseja usar
kill -- -$$
, o que envia o sinal também para o seu script, você precisa limpar a armadilha antes de executar o kill ou você terminará com um loop infinito de kill && trap .Por exemplo:
Conforme explicado nos comentários, o problema é que o script recebe o sinal, mas aguarda o término do programa de suspensão antes de processar o sinal recebido. Portanto, você deve matar os processos filhos (neste caso, o processo de suspensão) para executar a ação de interceptação. Você pode fazer isso com algo como o seguinte:
Ou como indicado nos comentários:
fonte
./script.sh & sleep 1 && kill -- -$(pgrep script.sh)
enviar um sinal de interrupção também para os processos filhos do seu script.