Xảy ra ít nhất trên phiên bản bash GNU 4.3.42 x86_64 && GNU bash phiên bản 4.3.11 x86_64
Tôi sử dụng sleep & wait $!
thay vì đơn giản sleep
để nhận sleep
tín hiệu ngắt (như SIGUSR1 ). Nhưng có vẻ như wait
bash-buildin hành xử theo một cách kỳ lạ khi bạn chạy như sau.
Nhà ga 1:
cat <(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
Nhà ga 2:
kill -10 /the pid of the subshell, printed by the previous command/
Nhà ga 1:
^C (ctrl + C)
Sau đó, tôi nhận được lớp con đốt cháy CPU ở mức 100 phần trăm.
Nhà ga 1:
pkill -P $(pgrep -P $$)
Bạn có biết tại sao hành vi này xảy ra không?
NB : không có vấn đề xảy ra khi cat <(/subshell/)
không có nền.
Một cách khác để trải nghiệm hành vi này
Nhà ga 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
Nhà ga 2:
kill -10 /the pid of the subshell, printed by the previous command/
Nhà ga 1:
fg
^C (ctrl + C)
Sau đó, lấy vỏ đông lạnh.
Cách thứ ba để trải nghiệm hành vi này
Nhà ga 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)
Nhà ga 2:
kill -10 /the pid of the subshell, printed by the previous command/
Nhà ga 1:
^C (ctrl + C)
Sau đó, lấy vỏ đông lạnh.
bash
4.4, có lẽ điều này ở đây có thể bị ảnh hưởng.
wait
đó trông rất giống với điều này. Tôi đã bị tấn công bởi điều đó trong một vòng lặp sinh ra các quy trình con mãi mãi. Tuy nhiên, tôi đã thử nghiệm kịch bản của bạn vào ngày 4.4.20 và nó vẫn là một vấn đề. Thật thú vị, khi tôi đính kèm một trình gỡ lỗi trên một phiên bản do tôi xây dựng, tôi có thể thấy nó đang lặp đi lặp lại, nhưng nó cũng có tác dụng phá vỡ nó và vòng lặp sẽ bắt đầu xuất hiện lại 'thử nghiệm'. Nói cách khác: gắn trình gỡ lỗi làm cho nó ngừng quay vòng.