किलॉल सभी को नहीं मारता है और शायद ही कभी मारता है, तब के लिए कमान क्या है?


12

मैं कभी-कभी killallप्रक्रियाओं को मारने के लिए कमांड का उपयोग करता हूं । कारण है कि मैं कहता हूँ कि महासागरीय है कि कुछ मामलों में यह मेरे लिए काम नहीं किया है।

एक हालिया उदाहरण थंडरबर्ड के साथ था जहां स्मृति में लगभग 5 उदाहरण थे इसलिए मैंने killallकमांड का उपयोग करने का फैसला किया । इसने 2 प्रक्रियाओं को मार दिया और 3 को अभी भी स्मृति में छोड़ दिया गया था। फिर से कोशिश की और 3 अभी भी वहाँ थे।

इसलिए मैंने kill -9व्यक्तिगत रूप से प्रत्येक प्रक्रिया को उनके छिद्रों के माध्यम से मारने के लिए कमांड का उपयोग किया । वह काम किया।

मैं ज्यादातर kill -9कमांड का उपयोग करता हूं क्योंकि यह काम करता है। killallआदेश मुझे तो कई बार मैं बस इसे का उपयोग परेशान नहीं है नीचा दिखाया है। लेकिन एक कारण होना चाहिए कि यह काम क्यों नहीं करता है। क्या मैं इसका गलत इस्तेमाल कर रहा हूं?

मुझे पता है कि अन्य कमांड भी हैं, pkillलेकिन मैं यह समझने के लिए आभारी हूं कि killallकमांड अपेक्षा के अनुरूप काम क्यों नहीं करता है। मैंने भी सिर्फ एक प्रक्रिया को मारने की कोशिश की है और यह एक हिट और मिस अफेयर है। लेकिन kill -9कमांड हर बार काम करता है।

कोई विचार?

पुनश्च: sudoकोई फर्क नहीं पड़ता

जवाबों:


22

हत्यारे के लिए मैन पेज से

किंडल किसी भी निर्दिष्ट कमांड को चलाने वाली सभी प्रक्रियाओं के लिए एक संकेत भेजता है। यदि कोई संकेत नाम निर्दिष्ट नहीं है, तो SIGTERM भेजा जाता है।

जब आप ए kill -9करते हैं, आप SIGKILL सिग्नल भेज रहे हैं। यदि आप हत्यारे के साथ एक SIGKILL भेजना चाहते हैं, तो आपको करने की आवश्यकता है

killall -s SIGKILL <PROCESSNAME>

SIGKILL और SIGTERM के बीच अंतर की एक अच्छी व्याख्या (और आपको पहले SIGTERM क्यों प्रयास करना चाहिए)

से http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

यूनिक्स प्रणाली पर हत्या का उपयोग करने वाली प्रक्रियाओं के लिए सिग्नल भेजना अधिकांश सिस्टम प्रशासकों के लिए एक नया विषय नहीं है, लेकिन मुझे कई बार किल और किल -9 के बीच अंतर के बारे में पूछा गया है।

जब भी आप किसी प्रक्रिया पर किल का उपयोग करते हैं, तो आप वास्तव में प्रक्रिया को एक संकेत भेज रहे हैं (लगभग सभी स्थितियों में - मैं जल्द ही उस में मिलूंगा)। मानक सी अनुप्रयोगों में एक हेडर फ़ाइल होती है जिसमें चरण होते हैं जो प्रक्रिया का पालन करना चाहिए यदि यह एक विशेष संकेत प्राप्त करता है। आप अपने सिस्टम पर उपलब्ध संकेतों की पूरी सूची को मारने के लिए मैन पेज की जाँच करके प्राप्त कर सकते हैं।

इस तरह एक आदेश पर विचार करें:

kill 2563

यह SIGTERM नामक सिग्नल को प्रक्रिया में भेजेगा। एक बार प्रक्रिया नोटिस प्राप्त करने के बाद, कुछ अलग चीजें हो सकती हैं:

  • प्रक्रिया तुरंत रुक सकती है
  • संसाधनों की सफाई के बाद थोड़ी देरी के बाद प्रक्रिया रुक सकती है
  • प्रक्रिया अनिश्चित काल तक चलती रह सकती है

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

जब कोई एप्लिकेशन SIGTERM का जवाब नहीं देता है, तो अधिकांश सिस्टम प्रशासक आमतौर पर अधिक अचानक सिग्नल का सहारा लेंगे:

kill -9 2563

-9 किल कमांड को बताता है कि आप सिग्नल # 9 भेजना चाहते हैं, जिसे SIGKILL कहा जाता है। इस तरह के नाम के साथ, यह स्पष्ट है कि यह संकेत थोड़ा अधिक भार वहन करता है।

यद्यपि SIGKILL को उसी सिग्नल हेडर फ़ाइल में SIGTERM के रूप में परिभाषित किया गया है, इसे प्रक्रिया द्वारा अनदेखा नहीं किया जा सकता है। वास्तव में, इस प्रक्रिया को संकेत संकेत से भी अवगत नहीं कराया जाता है क्योंकि सिग्नल सीधे कर्नेल इनिट में जाता है। उस बिंदु पर, init प्रक्रिया को रोक देगा। प्रक्रिया को कभी भी संकेत को पकड़ने और उस पर कार्रवाई करने का अवसर नहीं मिलता है।

हालाँकि, कर्नेल कुछ स्थितियों में प्रक्रिया को सफलतापूर्वक मारने में सक्षम नहीं हो सकता है। यदि प्रक्रिया नेटवर्क या डिस्क I / O की प्रतीक्षा कर रही है, तो कर्नेल इसे रोक नहीं पाएगा। एक निर्बाध नींद में पकड़ी गई ज़ोंबी प्रक्रियाओं और प्रक्रियाओं को कर्नेल द्वारा रोका नहीं जा सकता है, या तो। सिस्टम से उन प्रक्रियाओं को हटाने के लिए रिबूट की आवश्यकता होती है।

जब आपने थंडरबर्ड प्रक्रियाओं में किलॉल (SIGTERM) भेजा, तो आपने उन प्रक्रियाओं को रोकने का अनुरोध किया। उन प्रक्रियाओं में से कुछ सही ढंग से काम नहीं कर रहे थे (शायद आपको उन्हें पहले स्थान पर मारने की आवश्यकता क्यों थी), इसलिए वे सिगनल सिग्नल पर कार्य नहीं कर सकते थे।


इस बात पर कोई अटकलें कि इसने केवल वज्रपात के कुछ उदाहरण क्यों मारे?
मीर बोर्ग

@Doogfar मेरा संपादित राइटअप (या मेरे द्वारा लिंक किया गया पृष्ठ) देखें
tgm4883

धन्यवाद, यह भी बताता है कि मेरे थंडरबर्ड ने क्यों भ्रष्ट किया, किल -9 बहुत कठोर था
मीर बोर्ग

फिर भी हमेशा काम नहीं करता है।
क्रेग हिक्स

4

killallके रूप में एक ही वाक्यविन्यास के अधिकांश स्वीकार करता है kill। विशेष रूप से, इसके killallबराबर करने के लिए कुछ भी फैंसी लिखने की आवश्यकता नहीं है kill -9। यह ठीक काम करता है:

killall -9 thunderbird

(बेशक, जैसा कि चर्चा की गई है, आपको आमतौर पर उपयोग करने के लिए अनिच्छुक होना चाहिए killall -9, या समकक्ष killall -KILL, जब तक कि अन्य उपायों को पहले से ही सफलता के साथ करने की कोशिश नहीं की जाती है।)


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