Ocorre pelo menos no GNU bash versão 4.3.42 x86_64 && GNU bash versão 4.3.11 x86_64
Eu uso em sleep & wait $!
vez de um simples sleep
para obter uma interrupção sleep
por um sinal (como SIGUSR1 ). Mas parece que o wait
bash-builtin se comporta de uma maneira estranha quando você executa o seguinte.
Terminal 1:
cat <(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
Terminal 2:
kill -10 /the pid of the subshell, printed by the previous command/
Terminal 1:
^C (ctrl + C)
Então, recebo o subshell que queima uma CPU a 100%.
Terminal 1:
pkill -P $(pgrep -P $$)
Você tem alguma idéia de por que esse comportamento ocorre?
NB : nenhum problema ocorre quando o cat <(/subshell/)
não está em segundo plano.
Outra maneira de experimentar esse comportamento
Terminal 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
Terminal 2:
kill -10 /the pid of the subshell, printed by the previous command/
Terminal 1:
fg
^C (ctrl + C)
Então, pegue uma concha congelada.
Uma terceira maneira de experimentar esse comportamento
Terminal 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)
Terminal 2:
kill -10 /the pid of the subshell, printed by the previous command/
Terminal 1:
^C (ctrl + C)
Então, pegue uma concha congelada.
bash
4.4, talvez isso aqui possa ser afetado.wait
que se parece muito com isso. Fui atingido por isso em um loop que gerou subprocessos para sempre. No entanto, testei seu cenário na 4.4.20 e ainda era um problema. Curiosamente, quando anexei um depurador em uma versão que construí, pude ver que ele estava circulando, mas também teve o efeito de sair dele, e o loop começaria a emitir 'test' novamente. Em outras palavras: anexar o depurador fez com que ele parasse de girar.Respostas:
Observações
ctrl+c
enviaSIGINT
para o processo fg no Terminal 1kill -2 <PID>
no Terminal 2 é o mesmo que baterctrl+c
no Terminal 1kill -10 <PID>
no Terminal 2 manipulaSIGINT
corretamentekill -10 <PID>
no Terminal 2 (enviando sinalSIGUSR1
) não funcionaSIGINT
corretamente e leva ao comportamento problemáticokill -2 <PID>
no Terminal 2 (SIGINT
) porkill -15 <PID>
(SIGTERM
) oukill -9 <PID>
(SIGKILL
) sempre leva a corrigir o manuseio do sinal.kill -10 <PID>
no Terminal 2 interrompe owait
builtin, mas não sai do loop, poistest
é imediatamente impresso após o sinalSIGUSR1
ser interceptado e o loop continuar.SIGINT
interrompe o loop em execução e congela o shell ou ele nunca interrompewait
e fica esperando / congelado.Conclusão
SIGINT
não é cought e tratado corretamente ou é ignorado após a captura manualSIGUSR1
ou talvez qualquer outra captura definida pelo usuário. Isso significa que o processo ainda existe e é por isso que ele come / aquece a CPU ou congela o shell. A execuçãokill -15 <PID>
oukill -9 <PID>
do Terminal 2 finaliza / mata o processo e devolve o controle sobre o Terminal 1 e relaxa sua CPU.Por que esse problema ocorre, ainda permanece um mistério, mas espero que alguém possa explicar exatamente o que realmente está acontecendo por trás das cortinas.
fonte