Si verifica almeno su GNU bash versione 4.3.42 x86_64 && GNU bash versione 4.3.11 x86_64
Io uso sleep & wait $!
invece di un semplice sleep
per ottenere un interrompibile sleep
da un segnale (come SIGUSR1 ). Ma sembra che il wait
bash builtin si comporti in un modo strano quando si esegue quanto segue.
Terminale 1:
cat <(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
Terminale 2:
kill -10 /the pid of the subshell, printed by the previous command/
Terminale 1:
^C (ctrl + C)
Quindi, ottengo la subshell che brucia una CPU al 100 percento.
Terminale 1:
pkill -P $(pgrep -P $$)
Hai idea del perché si verifica questo comportamento?
NB : nessun problema si verifica quando cat <(/subshell/)
non è in background.
Un altro modo di provare questo comportamento
Terminale 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
Terminale 2:
kill -10 /the pid of the subshell, printed by the previous command/
Terminale 1:
fg
^C (ctrl + C)
Quindi, prendi un guscio congelato.
Un terzo modo di provare questo comportamento
Terminale 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)
Terminale 2:
kill -10 /the pid of the subshell, printed by the previous command/
Terminale 1:
^C (ctrl + C)
Quindi, prendi un guscio congelato.
bash
4.4, forse questo potrebbe esserne influenzato.
wait
che sembra molto simile a questo. Sono stato colpito da questo in un ciclo che ha generato per sempre sottoprocessi. Tuttavia, ho testato il tuo scenario su 4.4.20 ed era ancora un problema. È interessante notare che quando ho collegato un debugger a una versione che ho creato, ho potuto vedere che stava girando in giro, ma ha anche avuto l'effetto di uscirne, e il ciclo avrebbe ricominciato a produrre "test". In altre parole: il collegamento del debugger ha impedito lo spinloop.