SIGKILL और SIGTERM के बीच अंतर की एक अच्छी व्याख्या (और आपको पहले SIGTERM क्यों प्रयास करना चाहिए)
यूनिक्स प्रणाली पर हत्या का उपयोग करने वाली प्रक्रियाओं के लिए सिग्नल भेजना अधिकांश सिस्टम प्रशासकों के लिए एक नया विषय नहीं है, लेकिन मुझे कई बार किल और किल -9 के बीच अंतर के बारे में पूछा गया है।
जब भी आप किसी प्रक्रिया पर किल का उपयोग करते हैं, तो आप वास्तव में प्रक्रिया को एक संकेत भेज रहे हैं (लगभग सभी स्थितियों में - मैं जल्द ही उस में मिलूंगा)। मानक सी अनुप्रयोगों में एक हेडर फ़ाइल होती है जिसमें चरण होते हैं जो प्रक्रिया का पालन करना चाहिए यदि यह एक विशेष संकेत प्राप्त करता है। आप अपने सिस्टम पर उपलब्ध संकेतों की पूरी सूची को मारने के लिए मैन पेज की जाँच करके प्राप्त कर सकते हैं।
इस तरह एक आदेश पर विचार करें:
kill 2563
यह SIGTERM नामक सिग्नल को प्रक्रिया में भेजेगा। एक बार प्रक्रिया नोटिस प्राप्त करने के बाद, कुछ अलग चीजें हो सकती हैं:
- प्रक्रिया तुरंत रुक सकती है
- संसाधनों की सफाई के बाद थोड़ी देरी के बाद प्रक्रिया रुक सकती है
- प्रक्रिया अनिश्चित काल तक चलती रह सकती है
आवेदन यह निर्धारित कर सकता है कि एक SIGTERM प्राप्त होने के बाद वह क्या करना चाहता है। हालांकि अधिकांश एप्लिकेशन अपने संसाधनों को साफ करेंगे और रोकेंगे, कुछ नहीं। जब कोई SIGTERM प्राप्त होता है तो पूरी तरह से अलग करने के लिए एक एप्लिकेशन को कॉन्फ़िगर किया जा सकता है। इसके अलावा, यदि एप्लिकेशन खराब स्थिति में है, जैसे कि डिस्क I / O की प्रतीक्षा कर रहा है, तो यह उस सिग्नल पर कार्य करने में सक्षम नहीं हो सकता है जो भेजा गया था।
जब कोई एप्लिकेशन SIGTERM का जवाब नहीं देता है, तो अधिकांश सिस्टम प्रशासक आमतौर पर अधिक अचानक सिग्नल का सहारा लेंगे:
kill -9 2563
-9 किल कमांड को बताता है कि आप सिग्नल # 9 भेजना चाहते हैं, जिसे SIGKILL कहा जाता है। इस तरह के नाम के साथ, यह स्पष्ट है कि यह संकेत थोड़ा अधिक भार वहन करता है।
यद्यपि SIGKILL को उसी सिग्नल हेडर फ़ाइल में SIGTERM के रूप में परिभाषित किया गया है, इसे प्रक्रिया द्वारा अनदेखा नहीं किया जा सकता है। वास्तव में, इस प्रक्रिया को संकेत संकेत से भी अवगत नहीं कराया जाता है क्योंकि सिग्नल सीधे कर्नेल इनिट में जाता है। उस बिंदु पर, init प्रक्रिया को रोक देगा। प्रक्रिया को कभी भी संकेत को पकड़ने और उस पर कार्रवाई करने का अवसर नहीं मिलता है।
हालाँकि, कर्नेल कुछ स्थितियों में प्रक्रिया को सफलतापूर्वक मारने में सक्षम नहीं हो सकता है। यदि प्रक्रिया नेटवर्क या डिस्क I / O की प्रतीक्षा कर रही है, तो कर्नेल इसे रोक नहीं पाएगा। एक निर्बाध नींद में पकड़ी गई ज़ोंबी प्रक्रियाओं और प्रक्रियाओं को कर्नेल द्वारा रोका नहीं जा सकता है, या तो। सिस्टम से उन प्रक्रियाओं को हटाने के लिए रिबूट की आवश्यकता होती है।
जब आपने थंडरबर्ड प्रक्रियाओं में किलॉल (SIGTERM) भेजा, तो आपने उन प्रक्रियाओं को रोकने का अनुरोध किया। उन प्रक्रियाओं में से कुछ सही ढंग से काम नहीं कर रहे थे (शायद आपको उन्हें पहले स्थान पर मारने की आवश्यकता क्यों थी), इसलिए वे सिगनल सिग्नल पर कार्य नहीं कर सकते थे।