"मारना <पीआईडी>" वास्तव में प्रक्रिया को नहीं मार रहा है, क्यों?


118

मैं अपनी कमांड लाइन कौशल में सुधार करने की कोशिश कर रहा हूं और मुझे एक समस्या का सामना करना पड़ा है जहां मैं एक प्रक्रिया को नहीं मार सकता। मैं टाइप करता हूं kill 2200जहां 2200 मेरी पीआईडी ​​है और प्रक्रिया को नहीं मारा गया है। कुछ मिनट के बाद प्रतीक्षा में अब भी है topऔर ps aux। मैंने भी इसे sudo के साथ टाइप करने की कोशिश की है - कोई परिणाम नहीं।

किसी भी विचार क्यों यह ऐसा होगा?


संपादित करें

मुझे एक अजीब निर्भरता मिली है, जहां fgप्रक्रियाओं की सूची अपडेट होती है:

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps

वह कौन सी प्रक्रिया थी? क्या आपने जाँच की कि क्या प्रक्रिया शायद ख़राब थी ? उस स्थिति में आपको मूल प्रक्रिया को मारना होगा।
htorque

प्रक्रिया है top(जैसा कि संपादन में सूचीबद्ध है)। मैं सिर्फ पृष्ठभूमि में काम करने के लिए कार्यक्रम डालने की कोशिश करना चाहता था और फिर उसे वापस लाना चाहता था।
पैट्रीक

2
यदि आप CTRL-z के साथ किसी प्रक्रिया को निलंबित करते हैं, तो यह अधिकांश संकेतों को तब तक रोक देगा जब तक कि यह निलंबित न हो जाए (यानी जब तक आप fgया bgप्रक्रिया के लिए नहीं करते हैं)
nos

जवाबों:


179

प्रक्रियाएं कुछ संकेतों को अनदेखा कर सकती हैं। यदि आप SIGKILL भेजते हैं तो वह इसे अनदेखा नहीं कर सकेगा (और न ही इसे क्लीनअप करने के लिए पकड़ सकेगा)। प्रयत्न, कोशिश:

kill -9 {PID}

मैनुअल पेज पढ़कर और जानें:

man kill

22
यह भी ध्यान दें कि कुछ बहुत विशिष्ट परिस्थितियों में , एक प्रक्रिया एक ज़ोंबी / विक्षिप्त अवस्था में हो सकती है जो SIGKILL भी प्रक्रिया को नहीं मार सकती है। उस स्थिति में, आपको मूल प्रक्रिया को खोजना होगा और मूल प्रक्रिया को मारना होगा।
रेयान

15
यदि वह प्रक्रिया लाइन से बाहर जाती है तो यह KIL DINE NINE है !
स्कॉटलैंड

4
और कभी-कभी कोई माता-पिता प्रक्रिया नहीं होती है, जिस स्थिति में आप बस खराब हो जाते हैं। ऐसी प्रक्रिया को हटाने का एकमात्र तरीका मशीन को रिबूट करना है।
user606723

2
मार कमांड का नाम कई, कई उपयोगकर्ताओं (शुरुआत में मेरे सहित) के लिए भ्रामक है। एक मानता है कि जब आप कहते हैं "किल एक्स" तो इसका मतलब वास्तव में एक्स को मारना है और कुछ और नहीं करना है। मैं समझता हूँ कि इससे बात नहीं बदलेगी, लेकिन मेरी इच्छा है कि उन्होंने एक और विस्तृत नाम चुन लिया हो ...
rbaleksandar

1
kill -9काम नहीं करने के बाद भी क्या करना है और प्रक्रिया अभी भी लटका हुआ है?
डगलस गास्केल

42

यदि killकिसी पैरामीटर के बिना लागू किया जाता है, तो यह सिग्नल नंबर 15 ( SIGTERM) भेजता है । इस संकेत को प्रक्रिया द्वारा अनदेखा किया जा सकता है। यह संकेत उसकी चीजों को साफ करने की प्रक्रिया को सूचित करता है और फिर खुद से सही ढंग से समाप्त होता है। यह अच्छा तरीका है।

आप सिग्नल संख्या 9 ( SIGKILL) को "भेज" भी सकते हैं जिसे प्रक्रिया द्वारा अनदेखा नहीं किया जा सकता है। प्रक्रिया इसे पहचान भी नहीं पाएगी, क्योंकि कर्नेल प्रक्रिया को समाप्त करता है, प्रक्रिया को ही नहीं। वह दुष्ट तरीका है।

एक कहता है kill -9 <pid>हमेशा काम करता है। यह एक अविश्वास है । ऐसी परिस्थितियां हैं जहां kill -9प्रक्रिया को भी नहीं मारता है। उदाहरण के लिए जब एक प्रक्रिया में स्थिति होती है D(निर्बाध नींद)। एक प्रक्रिया इस स्थिति में आती है कि वह I / O (आमतौर पर बहुत लंबी नहीं) की प्रतीक्षा करती है। इसलिए, यदि कोई प्रक्रिया I / O (उदाहरण के लिए एक दोष हार्डडिस्क पर) की प्रतीक्षा करती है और इसे ठीक से प्रोग्राम नहीं किया जाता है (एक टाइमआउट के साथ), तो आप बस इस प्रक्रिया को नहीं मार सकते । कोई फर्क नहीं पड़ता कि आप क्या करते हैं। आप बस उस फ़ाइल को सुलभ बनाने का प्रयास कर सकते हैं जो प्रक्रिया जारी है।


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

7

यह नाम की हत्या के बावजूद वास्तव में प्रक्रियाओं को नहीं मारता है, यह इसके लिए संकेत भेजता है। मैन पेज से:

kill - send a signal to a process

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

एक अन्य आम संकेत SIGHUP है जो अक्सर एक प्रोग्राम को अपनी कॉन्फ़िगरेशन फ़ाइलों को फिर से पढ़ने के लिए कहने के लिए उपयोग किया जाता है।

यदि आप वास्तव में एक प्रोग्राम को मारना चाहते हैं तो आपको SIGKILL सिग्नल का उपयोग करना होगाkill -9 [pid]


2

ऐसा लगता है कि आप एक प्रक्रिया को स्थगित कर सकते हैं (शायद टर्मिनल में Ctrl-Z दबाकर)। इस स्थिति में, आपकी प्रक्रिया एक SIGTERM का जवाब नहीं देगी क्योंकि यह जमी हुई है। रनिंग 'fg' प्रक्रिया को थैज़ करता है, इसलिए यह सिग्नल और सेल्फ-टर्मिनेट कर सकता है। यह समझा सकता है कि 'fg' प्रक्रिया सूची को अद्यतन करने के लिए क्यों प्रकट होता है।


1
तो संलग्न टर्मिनल कैसे खोजें?
ruX

0

C ++ के भीतर से, मैंने निष्पादित किया:

kill(4024, SIGKILL);

और एक linux (Ubuntu) टर्मिनल पर,

$ ps -ax | grep my_su

आउटपुट था:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

लगता है, यह (4024) अभी भी जीवित है। हालाँकि, जैसे ही मैंने मूल प्रक्रिया को समाप्त कर दिया, जिसे उपरोक्त "किल" कथन कहा गया, ४०२४ कोई और दिखाई नहीं दिया। अब मैं "डिफंक्ट" प्रक्रिया को प्रदर्शित करता हूं और प्रदर्शित की जाने वाली रेखा से अधिक कुछ भी नहीं है और इसे अनदेखा करने का फैसला किया है। मुझे उम्मीद है कि मेरा अनुभव वहां किसी को मदद कर सकता है। चीयर्स!


0

आप kill -lअपनी वास्तुकला द्वारा समर्थित संकेतों को प्रदर्शित करने के लिए भी उपयोग कर सकते हैं , और उस सिग्नल के बारे में अधिक जानें जो आप सिग्नल को ठीक से उपयोग करने के लिए उपयोग कर सकते हैं।

नोट: जैसा कि दूसरों ने उल्लेख किया है, kill -9 {PID}जब तक इसकी ज़ोंबी प्रक्रिया नहीं होती है, तब तक इसके उपयोग की सिफारिश नहीं की जाती है। एक बार एक प्रक्रिया प्राप्त करने के बाद एक सफाई तुरंत बिना किसी अन्य उचित प्रक्रियाओं के बंद हो जाएगी।


0

यह वही है जो मैंने पोर्ट 80 पर चलने वाली लोकलहोस्ट को पिल करने के लिए इस्तेमाल किया (बाइ एंगुलर क्लाई) पोर्ट 80 पर रनिंग ऐप की जानकारी प्राप्त करें

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

जहां 3348चल रही प्रक्रिया से pid है

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