कम से कम GNU बैश संस्करण 4.3.42 x86_64 और& GNU बैश संस्करण 4.3.11 x86_64 पर होता है
मैं एक संकेत (एक SIGUSR1 के रूप में ) के साथ एक रुकावट प्राप्त sleep & wait $!
करने के लिए एक सरल के बजाय का उपयोग करता हूं । लेकिन ऐसा लगता है कि जब आप निम्नलिखित चलाते हैं तो बैश-बिलीन एक अजीब तरीके से व्यवहार करता है।sleep
sleep
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 $$)
क्या आपके पास इस बारे में कोई विचार है कि यह व्यवहार क्यों होता है?
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 पर आपके परिदृश्य का परीक्षण किया और यह अभी भी एक समस्या थी। दिलचस्प बात यह है कि जब मैंने अपने द्वारा बनाए गए संस्करण पर डिबगर संलग्न किया था, तो मैं देख सकता था कि यह चारों ओर से लूप कर रहा है, लेकिन इसका असर इसके टूटने पर भी पड़ा और लूप फिर से 'टेस्ट' का उत्पादन शुरू कर देगा। दूसरे शब्दों में: डिबगर को अटैच करने से यह स्पिनलोपिंग बंद हो जाता है।