जब Ctrl + C किसी प्रक्रिया को मार नहीं सकता तो क्या करें?


171

Ctrl+ Cहमेशा वर्तमान प्रक्रिया को मारने के लिए काम नहीं करता है (उदाहरण के लिए, यदि यह प्रक्रिया कुछ नेटवर्क संचालन में व्यस्त है)। उस स्थिति में, आप बस अपने कर्सर द्वारा "^ C" देखते हैं और बहुत कुछ नहीं कर सकते।

मेरे टर्मिनल को खोए बिना उस प्रक्रिया को अब मरने के लिए मजबूर करने का सबसे आसान तरीका क्या है?

जवाब का सारांश: आमतौर पर, आप कर सकते हैं Ctrl+ Zसोने के लिए प्रक्रिया डाल करने के लिए, और उसके बाद करना kill -9 _process-pid_है, जहाँ आप के साथ प्रक्रिया के पीआईडी को खोजने ps और अन्य उपकरणों। पर बैश (और संभवतः अन्य गोले), आप कर सकते हैं kill -9 %1(या सामान्य रूप में '% N'), जो आसान है। यदि Ctrl+ Zकाम नहीं करता है, तो आपको एक और टर्मिनल खोलना होगा और वहां से मारना होगा।


screenएक संभावित समाधान होगा, जिससे आप एक नई विंडो और killवहां से प्रक्रिया बना सकेंगे ।
बॉबी

2
यह मानते हुए कि आप पहले से ही एक स्क्रीन में थे :)
डस्टिन बोसवेल

जवाबों:


119

क्यों की समस्या को समझने के लिए Ctrl+ Cकाम नहीं करता है, यह समझना क्या होता है जब आप इसे प्रेस बहुत उपयोगी है:

अधिकांश गोले बाँध Ctrl+ C"एक भेजने के लिए SIGINT कार्यक्रम है कि वर्तमान में अग्रभूमि में चलता है करने के लिए संकेत"। आप आदमी सिग्नल के माध्यम से विभिन्न संकेतों के बारे में पढ़ सकते हैं :

 SIGINT        2       Term    Interrupt from keyboard

कार्यक्रम उस संकेत को अनदेखा कर सकते हैं, क्योंकि वे SIGTSTP को भी अनदेखा कर सकते हैं :

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(ऐसा तब होता है जब आप सबसे ज्यादा गोले दबाते हैं Ctrl+ Z, यही वजह है कि यह काम करने की गारंटी नहीं है।)

कुछ संकेत हैं जिन्हें प्रक्रिया द्वारा नजरअंदाज नहीं किया जा सकता है: सिगिल , सिगस्टॉप और कुछ अन्य। आप इन संकेतों को किल कमांड के माध्यम से भेज सकते हैं । इसलिए, अपने हैंगिंग / जॉम्बीइंग प्रोसेस को मारने के लिए, बस प्रोसेस आईडी (PID) ढूंढें । उदाहरण के लिए, इसका उपयोग करें pgrepया psफिर kill:

 % kill -9 PID

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

अफसोस, कभी-कभी ctrl + c, ctrl + z, और ctrl + \ _ सभी कुछ नहीं करते हैं, और प्रक्रिया पूर्ववत सूडो (पासवर्ड के बिना अनुमत) चल रही है ताकि आप प्रक्रिया को संकेत न भेज सकें।
माइकल

112

यदि Ctrl+ C(SIGINT) काम नहीं करता है, तो Ctrl+ \(SIGQUIT) प्रयास करें । फिर प्रयास करें Ctrl+ Z(SIGTSTP)। यदि वह आपको शेल प्रॉम्प्ट killपर लौटाता है, तो प्रक्रिया आईडी पर करें। (यह SIGTERM सिग्नल को डिफॉल्ट करता है, जिसे आप निर्दिष्ट कर सकते हैं kill -TERM। कुछ गोले में, आप %1PID को संदर्भित करने के लिए उपयोग करने में सक्षम हो सकते हैं ।) यदि वह काम नहीं करता है, तो दूसरे टर्मिनल या SSH सत्र पर जाएं और करें killया kill -TERMकरें। प्रक्रिया आईडी। केवल एक अंतिम उपाय के रूप में आपको करना चाहिए kill -KILL, उर्फ kill -9, क्योंकि यह प्रक्रिया को सफाई से गर्भपात करने, अपनी खुली फ़ाइलों को सिंक करने, इसकी अस्थायी फ़ाइलों को निकालने, नेटवर्क कनेक्शन बंद करने आदि का कोई मौका नहीं देता है।


32

प्रोग्राम को स्थगित करने और पृष्ठभूमि में रखने के लिए Ctrl-Z दबाएं :

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(फिर से उपयोग करने के लिए अग्रभूमि को पुनर्स्थापित करें fg)

उसके बाद, आप कर सकते हैं killया kill -9यह अपने प्रक्रिया ID दिया (आपको लगता है कि से प्राप्त ps a)।


13
बैश के साथ आप कर सकते हैं kill $!, जैसा $!कि एक विशेष चर है जिसमें अंतिम पृष्ठभूमि वाले कार्यक्रम के पीआईडी ​​हैं।
ल्लोकेई

@ ल्लोकी मेरे लिए काम नहीं करता (कम से कम विश्वसनीय नहीं)। bgवैरिएबल को असाइन किया गया मान मिलने से पहले मुझे एक बार जाना होगा।
डैनियल बेक

2
@ डैनियल, सही। जैसा कि मैंने कहा कि अंतिम पृष्ठभूमि वाली प्रक्रिया है, इस प्रकार bgइसे Ctrl + Z के ठीक बाद की आवश्यकता है, यह केवल निलंबित है।
ललकी

2
नोट: यह सिर्फ एक चाल नहीं है, अगर psआउटपुट (या killall) का उपयोग करना काफी जोखिम भरा है यदि आपके पास एक ही नाम के साथ कई प्रक्रियाएं चल रही हैं। ps -e -o pid,commandकेवल प्रोग्राम का नाम ही नहीं, बल्कि फिर से भेदभाव करने के लिए पर्याप्त नहीं हो सकता है। इसके विपरीत $!एक निश्चित हिट है।
ल्लोकेई

1
@ ललोई मैं असहमत हूं। ps aमेरे सिस्टम पर उदाहरण आउटपुट लाइन : एक ही कमांड के 27721 s000 T 0:00.09 topकितने सस्पेंड ( T, मुझे लगता है) इंस्टेंस ( top) क्या आपके पास एक ही tty ( s000) में चल रहा है ?
डैनियल बेक

30

इस लिंक को भी देखें ।

Ctrl+ Z: एक प्रक्रिया को रोकें।

Ctrl+ C: विनम्रता से प्रक्रिया को अब बंद करने के लिए कहें।

Ctrl+ \: निर्दयता से उस प्रक्रिया को मारना जो वर्तमान में अग्रभूमि में है


"ctrl"+ "\"मेरे लिए काम नहीं किया
बेंजामिन जाफरी

13

आमतौर पर, आप अभी भी प्रक्रिया ( Ctrl+ Z) को रोक सकते हैं और फिर उपयोग कर सकते हैं kill -9। इसके लिए kill -9, आपको पहले PID प्रक्रिया की आवश्यकता है । बैकग्राउंड जॉब्स के लिए, kill -9 %1इसे करना सबसे आसान तरीका है - यदि आप अनिश्चित हैं कि बैकग्राउंड जॉब की संख्या क्या है जिसे आप मारना, चलाना चाहते हैं jobs

वैकल्पिक रूप से, आप के साथ प्रक्रिया आईडी पा सकते हैं

ps

तब तुम दौड़ सकते हो

kill -9 <Appropriate PID from ps output>

5

बैश (और अन्य गोले?) के लिए एक सरल उपाय करना है:

Ctrl-z      followed by     kill -9 %1

जहाँ '% 1' से तात्पर्य नौकरी की संख्या मारे जाने से है। यह '% 2' (या कुछ और) हो सकता है यदि आपके पास पहले से ही अन्य कार्य हैं। आप देख सकते हैं कि जब आप Ctrl-z को मारते हैं तो वह कौन सी नौकरी का नंबर होता है:

[1]+  Stopped                 <process name>

ध्यान दें कि kill किल ’शेल का मार का संस्करण है, न कि बिन / किल।


4

1) यदि आप कंसोल पर हैं और बहु-उपयोगकर्ता मोड में हैं, तो आप CTRL-ALT-Fn दबा सकते हैं और दूसरी स्क्रीन पर लॉगिन कर सकते हैं, आईडी नंबर द्वारा प्रक्रिया का उपयोग ps -ef | grep <myprocessname>कर सकते हैं या pidof <myprocessname>फिर मार सकते हैं।

2) यदि आप दूर से जुड़े हुए हैं, तो दूसरे टर्मिनल सत्र के माध्यम से भी ऐसा ही करें।

आप भी htop स्थापित करके जीवन को थोड़ा आसान बना सकते हैं , जो शीर्ष का अधिक बहुमुखी संस्करण है जो आपको चुनिंदा रनिंग प्रक्रियाओं को मारने की अनुमति देता है। अधिकांश डिस्ट्रो में एक रेपो है।

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


0

यदि आप tmux या स्क्रीन का उपयोग कर रहे हैं, और उपरोक्त कार्यों में से कोई भी काम नहीं करता है <prefix> x, तब भी आप फलक को मार सकते हैं , तो प्रक्रिया भी मार दी जाती है।


0

हो सकता है कि आपके / etc / प्रोफाइल में SIGINT (2) के साथ एक जाल सेट हो। यदि हां, तो इसे हटा दें। लॉगआउट करें और वापस लॉग इन करें और आपको अच्छा होना चाहिए।

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