Se você substituir sua instrução trap
por essas três linhas:
trap "echo Exiting... INT; exit $?" INT
trap "echo Exiting... TERM; exit $?" TERM
trap "echo Exiting... EXIT; exit $?" EXIT
você obterá a saída
Exiting... TERM
Exiting... EXIT
do qual podemos deduzir
- A instrução
trap … TERM
faz com que o shell capture o sinal SIGTERM. O comandotimeout
envia ao processo um SIGTERM (por padrão) quando o tempo limite expirar. Então o shell pega o sinal e executa o comando especificado, incluindoecho
,rm
(em seu script real) eexit
. - A instrução
trap … EXIT
faz com que o shell deixe uma nota adesiva dizendo "lembre-se de fazer isso antes de ir para casa". Então, quando a armadilha SIGTERM executa o comandoexit
, a armadilha EXIT é executada. - Quando o trap EXIT executa o comando
exit
, o script realmente sai, em vez de executar a armadilha EXIT e ir para o inferno da recursão.
Se você digitar Ctrl + C enquanto o script estiver sendo executado,
você obterá a armadilha INT seguida pela armadilha EXIT.
Se você executar o script sem timeout
ou com uma duração de tempo limite maior que o tempo de espera, só obterá a interceptação EXIT.
Provavelmente é bom o suficiente para dizer
trap "exit $?" INT TERM
trap "echo Exiting...; rm $PIDFILE" EXIT
Eu acredito que a armadilha EXIT não precisa executar exit
,
porque você entra na armadilha EXIT executando um comando exit
(incluindo o implícito no final do script), então,
quando terminar de executar a interceptação EXIT ( echo
e rm
),
a casca não tem mais nada a fazer senão sair.
A única pergunta é com qual status de saída o script sai.
E, se você estivesse salvando algum valor de status de saída e fazendo
rm $PIDFILE; exit $saved_status
, isso pode ser interessante.
Mas enquanto você estiver falando sobre rm $PIDFILE; exit $?
,
o script provavelmente irá sair com o status de saída do rm
;
e isso provavelmente acontecerá por padrão
se o rm
for o último comando que você executa.
Eu fiz alguns testes rápidos que sugeriram que é possível deixar o
trap "exit" INT TERM
comando, mas eu não entendo isso. YMMV.
P.S. Como Thomas disse, trap … KILL
é ineficaz.