जब आप अच्छे के लिए एक प्रक्रिया को समाप्त करने की कोशिश करते हैं, तो आपको "मार" के लिए कौन सा विकल्प उपयोग करना चाहिए?


26

मुझे लोगों से बहुत सारे मिश्रित संदेश मिल रहे हैं, और सोच रहा था कि क्या वास्तव में यह इतना अंतर नहीं है कि आप क्या उपयोग करते हैं।

kill 'x'
killall 'x'
kill -9 'x'

ये कुछ विकल्प हैं जो मुझे अब तक उपयोग करने के लिए कहा गया है, लेकिन कुछ लोगों का कहना है कि किल -9 सिर्फ ओवरकिल है, खुद से काम करना है, आदि।

क्या किसी के पास कोई सलाह है जिस पर किसी प्रक्रिया को समाप्त करने के सबसे मानक मामले में इस्तेमाल किया जाना चाहिए (और इस तरह इसकी स्थिति भी)?

[संपादित करें] मैं देख रहा हूँ कि जब आप अपनी प्रक्रिया के निष्पादन को रोकना चाहते हैं तो क्या उपयोग करना है ताकि आप एक नया चला सकें, शुरू से ताजा


1
UUK9 फॉर्म लेटर भी देखें जो गाली देने से बचता हैSIGKILL
jw013

1
सभी अलग-अलग संकेतों को सूचीबद्ध करने के लिए, उनकी संख्या के साथ: kill -lऔर किसी संख्या को इसके संबंधित सिग्नल नाम में अनुवाद करने के लिए जैसे kill -l 9कि वापस आ जाएगा KILL

जवाबों:


24

ऐसे कई संकेत हैं जिनके डिफ़ॉल्ट स्वभाव को प्रक्रिया को समाप्त करना है। अंतिम समाप्ति संकेत SIGKILL है क्योंकि इसे संभाला नहीं जा सकता है और इस प्रक्रिया के पास मरने के अलावा कोई विकल्प नहीं है। हालांकि इसका मतलब यह भी है कि यदि आप इसे भेजते हैं, तो प्रक्रिया को साफ करने के अवसर से वंचित किया जाता है। इसलिए, अच्छे शिष्टाचार को SIGTERM की तरह एक संकेत भेजने की आवश्यकता होती है जिसे पहले ही संभाला जा सकता है और यदि प्रक्रिया कुछ समय बाद बाहर नहीं निकलती है तो इसे SIGKILL भेजें।

ध्यान दें कि SIGINT और SIGQUIT मनमानी प्रक्रिया समाप्ति के लिए अच्छे उम्मीदवार नहीं हैं। इस तथ्य के कारण कि वे टर्मिनल के कीबोर्ड से उत्पन्न हो सकते हैं, कई एप्लिकेशन उन्हें विशेष उद्देश्यों के लिए उपयोग करते हैं। उदाहरण के लिए, अजगर दुभाषिया KeyboardInterruptअपवाद उत्पन्न करने के लिए SIGINT का उपयोग करता है (इंटरेक्टिव पाइथन सत्रों में जहां यह शीघ्रता से वापस लौटता है) और JVM स्टैक ट्रैस को डंप करने के लिए SIGQUIT का उपयोग करता है। SIGINT और SIGQUIT अधिकांश मानक कमांड-लाइन उपयोगिताओं जैसे findया के लिए प्रभावी रहते हैं cat

सिस्टम शटडाउन के दौरान, अधिकांश UNIX और Linux सिस्टम SIGTERM को सभी प्रक्रिया में भेजते हैं, इसके बाद 5 सेकंड प्रतीक्षा करते हैं, उसके बाद SIGKILL। यह एक मनमानी प्रक्रिया को सुरक्षित रूप से बंद करने का अनुशंसित तरीका है।

यह भी ध्यान दें कि जब तक प्रक्रिया नहीं उठती तब तक SIGKILL एक अबाधित प्रतीक्षा में अटकी प्रक्रिया को समाप्त नहीं कर सकता है।


1
बहुत बढ़िया जवाब। क्या आपके पास kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;सिफारिश का संदर्भ है ?
l0b0

+1 तरह का जवाब। और SITEUP का क्या?
एलोइस महदाल

2
@ एलिसमहदल: SIGHUPउस दिन से आता है जब डायल-अप लाइनें आम थीं। उस सिग्नल को यह इंगित करने के लिए भेजा गया था कि लाइन लटका हुआ है। बाद में, जब यह कम आम SIGHUPथा, कभी-कभी डेमों द्वारा प्रक्रिया को पुनः आरंभ किए बिना कॉन्फिग फ़ाइल को फिर से पढ़ने के लिए उपयोग किया जाता था। इन आधुनिक समय SIGHUPमें शायद ही कभी इस्तेमाल किया जाता है। कई apachectl gracefulrndc reconfig[init.d|smf|upstart|launchd]
डेमोंन्स के पास रीइंस्टिटलाइज़

13

आपको जेंटलेट एक से शुरू करना चाहिए और वहां से आगे बढ़ना चाहिए। इसका मतलब है, SIGINT, SIGTERM, SIGQUIT, SIGKILL। हालांकि ज्यादातर लोग SIGINT और SIGQUIT को छोड़ देते हैं।


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