По крайней мере, в GNU bash версии 4.3.42 x86_64 && GNU bash версии 4.3.11 x86_64
Я использую sleep & wait $!
вместо простого sleep
для получения прерываемого sleep
сигнала (как SIGUSR1 ). Но кажется, что wait
bash-buildin ведет себя странным образом, когда вы запускаете следующее.
Терминал 1:
cat <(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
Терминал 2:
kill -10 /the pid of the subshell, printed by the previous command/
Терминал 1:
^C (ctrl + C)
Затем я получаю подоболочку, которая сжигает процессор на 100 процентов.
Терминал 1:
pkill -P $(pgrep -P $$)
Есть ли у вас идеи о том, почему такое поведение происходит?
NB : не возникает проблем, когда cat <(/subshell/)
нет в фоновом режиме.
Еще один способ испытать это поведение
Терминал 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
Терминал 2:
kill -10 /the pid of the subshell, printed by the previous command/
Терминал 1:
fg
^C (ctrl + C)
Затем получите замороженную раковину.
Третий способ испытать это поведение
Терминал 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)
Терминал 2:
kill -10 /the pid of the subshell, printed by the previous command/
Терминал 1:
^C (ctrl + C)
Затем получите замороженную раковину.
bash
4.4, возможно, это может повлиять на это.
wait
которая выглядит очень похоже на это. Я был поражен этим в цикле, который порождал подпроцессы навсегда. Тем не менее, я проверил ваш сценарий на 4.4.20, и это все еще было проблемой. Интересно, что когда я прикрепил отладчик к версии, которую я построил, я мог видеть, что он зацикливался, но он также имел эффект выхода из него, и цикл снова начал выводить 'test'. Другими словами: присоединение отладчика сделало его остановленным.