เกิดขึ้นอย่างน้อยในGNU bash รุ่น 4.3.42 x86_64 && GNU bash รุ่น 4.3.11 x86_64
ฉันใช้sleep & wait $!
แทนวิธีง่าย ๆsleep
ในการทำให้sleep
สัญญาณขัดจังหวะ(เหมือนSIGUSR1 ) แต่ดูเหมือนว่าwait
bash-builtin จะทำงานในลักษณะที่แปลกเมื่อคุณเรียกใช้สิ่งต่อไปนี้
อาคาร 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)
จากนั้นฉันจะได้รับ subshell ที่เผาไหม้ CPU ที่ 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 และยังคงมีปัญหาอยู่ ที่น่าสนใจเมื่อฉันแนบดีบักเกอร์ในเวอร์ชันที่ฉันสร้างขึ้นฉันเห็นว่ามันวนลูปไปรอบ ๆ แต่มันก็มีผลกระทบจากการแตกออกและลูปจะเริ่มส่ง 'ทดสอบ' อีกครั้ง กล่าวอีกนัยหนึ่ง: การแนบดีบักเกอร์ทำให้หยุดการหมุนได้