प्रतीक्षा बैश-बिलिन 100 प्रतिशत पर सीपीयू को जलाता है


16

कम से कम GNU बैश संस्करण 4.3.42 x86_64 और& GNU बैश संस्करण 4.3.11 x86_64 पर होता है

मैं एक संकेत (एक SIGUSR1 के रूप में ) के साथ एक रुकावट प्राप्त sleep & wait $!करने के लिए एक सरल के बजाय का उपयोग करता हूं । लेकिन ऐसा लगता है कि जब आप निम्नलिखित चलाते हैं तो बैश-बिलीन एक अजीब तरीके से व्यवहार करता है।sleepsleepwait

टर्मिनल 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)

फिर, एक जमे हुए खोल प्राप्त करें।


इसे डीबग करने के लिए, आपको संभवतः स्रोतों से बैश का निर्माण करना होगा और यह पता लगाना होगा कि यह कहां लूपिंग है (इसे डिबगर से तोड़ें या प्रिंट स्टेटमेंट जोड़ें) और यह लूपिंग क्यों है।
कज़

1
अजीब? मैं यहाँ इसे पुन: पेश नहीं कर सकता, मैं bash 4.3.42 (1) -release (x86_64-pc-linux-gnu) का उपयोग कर रहा हूँ। डेबियन 8. कर्नेल 4.6.1-1। मैं उन सभी परीक्षणों को करता हूं जो आप कहते हैं, लेकिन सीपीयू अभी भी सामान्य रूप से चल रहा है ... मैं बिल्कुल वैसा ही कर रहा हूं जैसे आप एफजी, और फिर सीटीआरएल / सी कहते हैं।
लुसियानो एंड्रेस मार्टिनी

मुझे यह याद है कि bash4.4 में बिल्ट-इन और सिग्नल से जुड़ी कुछ चीजें बदल गईं , हो सकता है कि यह यहां प्रभावित हो।
phk

बैश 4.4.20 एक स्पिनलूप समस्या को ठीक करता है waitजो इस के समान है। मैं उस पाश में मारा गया था जिसने हमेशा के लिए उप-प्रक्रियाओं को जन्म दिया। हालाँकि, मैंने 4.4.20 पर आपके परिदृश्य का परीक्षण किया और यह अभी भी एक समस्या थी। दिलचस्प बात यह है कि जब मैंने अपने द्वारा बनाए गए संस्करण पर डिबगर संलग्न किया था, तो मैं देख सकता था कि यह चारों ओर से लूप कर रहा है, लेकिन इसका असर इसके टूटने पर भी पड़ा और लूप फिर से 'टेस्ट' का उत्पादन शुरू कर देगा। दूसरे शब्दों में: डिबगर को अटैच करने से यह स्पिनलोपिंग बंद हो जाता है।
हाफगैर

जवाबों:


1

टिप्पणियों

  • ctrl+cSIGINTटर्मिनल 1 में fg- प्रक्रिया को भेजता है
  • इसलिए, kill -2 <PID>टर्मिनल 2 में निष्पादित करना ctrl+cटर्मिनल 1 में मारने के समान है
  • टर्मिनल 2 में निष्पादित करने से पहले ऊपर दिए गए दो बिंदुओं में से एक को सही ढंग से संभालनाkill -10 <PID>SIGINT
  • टर्मिनल 2 (सिग्नल भेजना ) में निष्पादित करने के बाद इसे सही तरीके से हैंडल नहीं करना और समस्याग्रस्त व्यवहार की ओर ले जाता हैkill -10 <PID>SIGUSR1SIGINT
  • जगह kill -2 <PID>टर्मिनल 2 (में SIGINT) के साथ kill -15 <PID>( SIGTERM) या kill -9 <PID>( SIGKILLसही संकेत से निपटने के लिए हमेशा) की ओर जाता है।
  • kill -10 <PID>टर्मिनल 2 में निष्पादित बिल्टिन को बाधित waitकरता है लेकिन लूप को नहीं छोड़ता है क्योंकि testसिग्नल फंसने के तुरंत बाद प्रिंट होता SIGUSR1है और लूप जारी रहता है।
  • भेजा जा रहा है SIGINTक्रियान्वित लूप से बाहर टूट जाता है और खोल फ़्रीज़ या यह कभी नहीं बीच में आता है waitऔर रहता है इंतज़ार कर / जमे हुए।

निष्कर्ष

SIGINTको सही ढंग से नहीं पकड़ा गया है और इसे हाथ से पकड़ा नहीं गया है SIGUSR1या मैन्युअल रूप से फंसने के बाद इसे अनदेखा किया गया है या हो सकता है कि किसी अन्य उपयोगकर्ता को फंसाया गया हो। इसका मतलब है कि यह प्रक्रिया अभी भी मौजूद है और इसलिए यह सीपीयू को खाती / गर्म करती है या शेल को जमा देती है। टर्मिनल 2 से छूटना kill -15 <PID>या kill -9 <PID>समाप्त करना प्रक्रिया को समाप्त करता है और आपको टर्मिनल 1 पर नियंत्रण वापस देता है और आपके सीपीयू को आराम देता है।

यह समस्या क्यों होती है, अभी भी एक रहस्य बना हुआ है, लेकिन मुझे आशा है कि कोई व्यक्ति वास्तव में समझा सकता है कि पर्दे के पीछे वास्तव में क्या हो रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.