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ê quiser usar kill -- -$$
, 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 kill
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
Como explicado nos comentários, o problema é que o script recebe o sinal, mas está aguardando que o programa do sono termine antes de processar o sinal recebido. Portanto, você deve eliminar os processos filho (o processo de suspensão, neste caso) para executar a ação de interceptação. Você pode fazer isso com algo como o seguinte:
kill -- -$(pgrep script.sh)
Ou como indicado nos comentários:
killall -g script.sh