Eu tenho o seguinte script:
#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat # wait indefinitely
Quando envio SIGHUP
(usando kill -HUP pid
), nada acontece.
Se eu mudar um pouco o script:
#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT # add this
trap "echo HUP" SIGHUP
cat # wait indefinitely
... então o script faz a echo HUP
coisa certa quando sai (quando pressiono Ctrl + C):
roger@roger-pc:~ $ ./hupper.sh
We are 6233
^CHUP
O que está acontecendo? Como devo enviar um sinal (não necessariamente precisa ser SIGHUP
) para esse script?
cat
processo terminar. Experimente o seu script original e pressioneCtrl+D
para sair docat
processo. Enquanto ocat
processo estiver em primeiro plano, oHUP
sinal não será acionado. Tente novamente comcat
substituído porread
(um shell interno).while true; do read; done
no final, caso contrário, a inserção de texto também fará com que ele saia e quero que saia em Ctrl + C.Respostas:
O manual do Bash declara:
Isso significa que, apesar do sinal ser recebido
bash
quando você o envia, sua armadilha no SIGHUP será chamada apenas quandocat
terminar.Se esse comportamento for indesejável, use
bash
builtins (por exemplo,read
+printf
em um loop em vez decat
) ou use trabalhos em segundo plano (consulte a resposta de Stéphane ).fonte
O @xhienne já explicou o motivo , mas se você deseja que o sinal atue imediatamente (e não saia do script), você pode alterar seu código para:
A pequena dança dos descritores de arquivo é contornar o fato de que o
bash
redirecionamento do stdin é/dev/null
para comandos iniciados em segundo plano.fonte