Występuje przynajmniej w wersji GNU bash 4.3.42 x86_64 i & GNU bash wersja 4.3.11 x86_64
Używam sleep & wait $!
zamiast prostego sleep
do uzyskania przerwania sleep
przez sygnał (jako SIGUSR1 ). Ale wygląda na to, że wait
wbudowane bash zachowuje się w dziwny sposób, gdy uruchomisz następujące.
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)
Następnie otrzymuję podpowłokę, która spala procesor w 100 procentach.
Terminal 1:
pkill -P $(pgrep -P $$)
Czy masz pojęcie o tym, dlaczego tak się dzieje?
Uwaga : nie występuje problem, gdy cat <(/subshell/)
nie ma go w tle.
Kolejny sposób, aby doświadczyć tego zachowania
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)
Następnie weź zamrożoną skorupę.
Trzeci sposób na doświadczenie tego zachowania
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)
Następnie weź zamrożoną skorupę.
bash
4.4, może to tutaj mieć wpływ.
wait
który wygląda bardzo podobnie do tego. Uderzyło mnie to w pętli, która odrodziła podprocesy na zawsze. Jednak przetestowałem twój scenariusz w dniu 4.4.20 i nadal był problem. Co ciekawe, kiedy dołączyłem debugger do zbudowanej przeze mnie wersji, widziałem, że się zapętla, ale miał również efekt wyrwania się z niego, a pętla znów zaczyna „testować”. Innymi słowy: dołączenie debuggera sprawiło, że przestał on spinloopować.