Зустрічається щонайменше у GNU bash версії 4.3.42 x86_64 && GNU bash версії 4.3.11 x86_64
Я використовую sleep & wait $!
замість простого sleep
для отримання перериваючого sleep
сигналу (як SIGUSR1 ). Але здається, що wait
вбудований у баштик поводиться дивним чином, коли ви виконуєте наступне.
Термінал 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 $$)
Чи маєте ви уявлення про те, чому така поведінка відбувається?
Примітка : жодна проблема не виникає, коли 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, і це все ще була проблема. Цікаво, що коли я приєднав налагоджувач до створеної вами версії, я міг побачити, що він крутиться навколо, але це також призвело до того, що він вирвався з нього, і цикл знову почне виводити "тест". Іншими словами: приєднання налагоджувача змусило його перестати крутитися.