Se produce al menos en GNU bash versión 4.3.42 x86_64 && GNU bash versión 4.3.11 x86_64
Utilizo en sleep & wait $!
lugar de un simple sleep
para obtener un interrumpible sleep
por una señal (como SIGUSR1 ). Pero parece que wait
bash-builtin se comporta de una manera extraña cuando ejecuta lo siguiente.
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)
Entonces, obtengo el subshell que quema una CPU al 100 por ciento.
Terminal 1:
pkill -P $(pgrep -P $$)
¿Tienes alguna idea de por qué ocurre este comportamiento?
NB : no se produce ningún problema cuando cat <(/subshell/)
no está en segundo plano.
Otra forma de experimentar este comportamiento.
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)
Luego, consigue una cáscara congelada.
Una tercera forma de experimentar este comportamiento.
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)
Luego, consigue una cáscara congelada.
bash
4.4, tal vez esto podría verse afectado.
wait
que se parece mucho a esto. Fui golpeado por eso en un bucle que generó subprocesos para siempre. Sin embargo, probé su escenario en 4.4.20 y todavía era un problema. Curiosamente, cuando adjunté un depurador en una versión que construí, pude ver que estaba dando vueltas, pero también tuvo el efecto de salir de él, y el bucle comenzaría a generar 'prueba' nuevamente. En otras palabras: adjuntar el depurador hizo que dejara de girar.