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.