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.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 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 trap
parece reagir apenas aos sinais enviados aos processos filhos/sub. Como iniciante, não consegui decifrar trap
a 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
trap
reage 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