मैं SIGTERM के साथ एक SIGSTOP'd प्रक्रिया को क्यों नहीं मार सकता, और लंबित सिग्नल कहाँ संग्रहीत है?


24

मैं डेबियन खिंचाव (सिस्टमड) का उपयोग कर रहा हूं। मैं अग्रभूमि में rsyslog डेमन चला रहा था /usr/sbin/rsyslogd -n और मैंने इसे रोकने के लिए a Ctrl+ Zकिया। प्रक्रिया की स्थिति Tl(बंद, थ्रेडेड) में बदल गई । मैंने प्रक्रिया को कई कमांड जारी किए , और प्रक्रिया की स्थिति समान थी :। एक बार जब मैंने ए किया , तो यह मर गया। मेरे 3 सवाल हैं।kill -15 <pid>Tlfg

  • SIGSTOP-एड-टू प्रोसेस का जवाब क्यों नहीं दिया गया SIGTERM? कर्नेल इसे उसी अवस्था में क्यों रखता है?
  • इसने उस क्षण को क्यों प्राप्त किया जो इसे SIGCONTसंकेत मिला था ?
  • यदि यह पिछले SIGTERMसिग्नल की वजह से था, तो इस प्रक्रिया को फिर से शुरू करने तक कहाँ रखा गया था?

जवाबों:


41

SIGSTOPऔर SIGKILLदो संकेत हैं जिन्हें किसी प्रक्रिया द्वारा पकड़ा और संभाला नहीं जा सकता है। SIGTSTPकी तरह है SIGSTOPसिवाय इसके कि यह कर सकते हैं पकड़ लिया और नियंत्रित किया।

SIGSTOPऔर SIGTSTPसंकेतों ने रास्ते में ही एक प्रक्रिया को रोकने, के लिए तैयार हो SIGCONT। जब आप उस प्रक्रिया को भेजते हैं SIGTERM, तो प्रक्रिया नहीं चल रही है और इसलिए यह बाहर निकलने के लिए कोड नहीं चला सकता है।

(वहाँ भी हैं SIGTTINऔर SIGTTOU, जो टीटीवाई परत द्वारा उत्पन्न संकेत हैं जब एक पृष्ठभूमि वाली नौकरी टर्मिनल को पढ़ने या लिखने की कोशिश करती है। उन्हें पकड़ा जा सकता है लेकिन अन्यथा प्रक्रिया को रोक देगा (निलंबित), ठीक वैसे ही SIGTSTP। लेकिन मैं अब जा रहा हूं। इस उत्तर के शेष के लिए उन दोनों को अनदेखा करें।)

आपकी CtrlZप्रक्रिया प्रक्रिया को भेजती है SIGTSTP, जो किसी भी तरह से विशेष रूप से नियंत्रित करने के लिए नहीं दिखाई देती है rsyslogd, इसलिए यह बस लंबित प्रक्रिया को निलंबित कर देती है SIGCONTया SIGKILL

यहां समाधान भी SIGCONTआपके बाद भेजना है SIGTERMताकि प्रक्रिया सिग्नल प्राप्त कर सके और संभाल सके।

उदाहरण:

sleep 999 &

# Assume we got PID 456 for this process
kill -TSTP 456    # Suspend the process (nicely)
kill -TERM 456    # Terminate the process (nicely). Nothing happens
kill -CONT 456    # Continue the process so it can exit cleanly

जीएनयू सी लाइब्रेरी के लिए प्रलेखन यह अच्छी तरह से समझाता है, मुझे लगता है (मेरी हाइलाइटिंग):

जबकि एक प्रक्रिया को रोक दिया जाता है, कोई और संकेत तब तक इसे वितरित नहीं किया जा सकता है जब तक कि इसे जारी रखा न जाए , सिवाय SIGKILLसंकेतों और (स्पष्ट रूप से) SIGCONTसंकेतों के। संकेतों को लंबित के रूप में चिह्नित किया जाता है, लेकिन तब तक वितरित नहीं किया जाता जब तक कि प्रक्रिया जारी न रखी जाए। सिग्नल हमेशा प्रक्रिया की समाप्ति का कारण बनता है और, अवरुद्ध नहीं किया जा सकता संभाला या नजरअंदाज कर दिया। आप अनदेखा कर सकते हैं , लेकिन यह हमेशा प्रक्रिया को जारी रखने का कारण बनता है अगर इसे रोका जाता है। किसी प्रक्रिया को सिग्नल भेजने से उस प्रक्रिया के किसी भी लंबित स्टॉप सिग्नल को छोड़ दिया जाता है। इसी तरह, किसी प्रक्रिया के लिए किसी भी लंबित सिग्नल को रोक दिया जाता है, जब वह स्टॉप सिग्नल प्राप्त करता हैSIGKILLSIGCONTSIGCONTSIGCONT


1
@nohup। उत्तर दिया गया, लेकिन अनिवार्य रूप से, "हाँ, यह kill -15आपके द्वारा पहले ही भेजा गया है"।
रोइमा

2
@nohup हाँ, प्रलेखन के अनुसार: « जबकि एक प्रक्रिया को रोक दिया जाता है, जब तक इसे जारी नहीं रखा जाता है, तब तक कोई और संकेत नहीं दिया जा सकता है ... संकेतों को लंबित के रूप में चिह्नित किया जाता है, लेकिन प्रक्रिया जारी रहने तक वितरित नहीं किया जाता है। »
रोएमा

1
SIGTTIN और SIGTTOU भी देखें जो प्रक्रियाओं को भी रोकते हैं
स्टीफन चेज़लस

1
@ स्टीफनचेलजेलस अच्छी बात। मैंने इनका उल्लेख किया है, लेकिन अन्यथा इन्हें अनदेखा कर दिया है। जैसा कि आप फिट देखते हैं, कृपया संपादित करने के लिए स्वतंत्र महसूस करें।
रोआमा

2
@coteyr। मैं असहमत हूं: SIGKILLएक ऐप को सफाई करने से रोकता है, इसलिए SIGTERMकई (अधिकांश) मामलों में उपयोग करना बेहतर होता है।
रोज़ा

9

SIGTERMकिसी भी अन्य संकेत की तरह है है कि यह एक प्रक्रिया द्वारा पकड़ा जा सकता है। सिग्नल प्राप्त करना बस प्रक्रिया को एक विशेष सिग्नल हैंडलर रूटीन में कूदना होगा। के लिए SIGTERMडिफ़ॉल्ट क्रिया प्रक्रिया समाप्त करने के लिए होगा, लेकिन जैसे एक संपादक संकेत पकड़ने के लिए तो यह मरने से पहले किसी भी खुली फ़ाइलों की एक मसौदा प्रति सहेज सकते हैं पसंद कर सकते हैं। यदि प्रक्रिया रोक दी जाती है, तो यह सिग्नल हैंडलर को नहीं चला सकता है, लेकिन प्रक्रिया जारी रहने तक सिग्नल लंबित रहेगा। ध्यान दें कि भेजे गए संकेतों की संख्या आमतौर पर सहेजी नहीं जाएगी।

सिद्धांत रूप में, सिस्टम यह जान सकता है कि क्या प्रक्रिया के लिए सिग्नल हैंडलर स्थापित है SIGTERMया नहीं और तुरंत इसे समाप्त कर दें। लेकिन (गाइल्स की टिप्पणी के अनुसार) पोसिक्स मांग करता है कि जब तक प्रक्रिया जारी रहेगी तब तक सिग्नल पेंड करेगाSIGCONT


4
माफी, मेरी पिछली टिप्पणी गलत थी। जबकि एक प्रक्रिया को रोक दिया जाता है, सिगकिल और सिगॉन्ट को छोड़कर कोई भी संकेत इसे नहीं दिया जाता है। यहां तक ​​कि अगर सिग्नल की अपनी डिफ़ॉल्ट कार्रवाई है जो प्रक्रिया को मारना है, तो यह देरी हो रही है जब तक कि प्रक्रिया एक SIGCONT द्वारा फिर से शुरू नहीं की जाती है। POSIX इस व्यवहार को अनिवार्य करता है।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.