इसे रोकने के बजाय यूनिक्स में एक प्रक्रिया को समाप्त करना


12

पर Unixकमांड लाइन अगर मैं प्रेस Ctrl-C, कि एक प्रक्रिया खत्म नहीं होता, बल्कि यह बीच में आता है और मैं सुरक्षा प्रॉम्प्ट पर वापस जाएँ।

इसलिए, मेरे पास दो प्रश्न हैं:

    1. क्या कोई तरीका है जो मैं सभी बाधित प्रक्रियाओं की सूची देख सकता हूं और उन्हें समाप्त कर सकता हूं?
    1. इसे बाधित करने के बजाय एक प्रक्रिया को समाप्त करने के लिए किस प्रमुख संयोजन को दबाएं?

जवाबों:



7

ऐतिहासिक रूप से कीस्ट्रोक्स से जुड़े तीन संकेत थे ये थे

  • SIGINT (व्यवधान) आमतौर पर Ctrl+ CयाDel
  • SIGQUIT - छोड़ो - आमतौर पर Ctrl+ के लिए बाध्य है\
  • SIGSUSP निलंबन - आमतौर पर Ctrl+ के लिए बाध्य हैZ

कुछ * निक्स फ्लेवर पर अन्य सिग्नल भी बंधे होते हैं, आप कमांड का उपयोग करके कीबोर्ड बाइंडिंग की जांच कर सकते हैं

stty -a

मेरे सिस्टम पर, OS / X, यह निम्नलिखित आउटपुट का उत्पादन करता है

speed 9600 baud; 65 rows; 213 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;

कृपया ध्यान दें कि इस उदाहरण में किल वर्तमान इनपुट बफर को साफ़ करने के लिए एक KILL संकेत नहीं है।

SIGQUIT का उपयोग करके प्रक्रियाओं को रोकने के साथ आपको अधिक सफलता मिल सकती है, लेकिन यह सच नहीं हो सकता है क्योंकि प्रक्रिया सिग्नल को पकड़ सकती है और इसे अनदेखा कर सकती है।

"बाधित" प्रक्रियाओं की एक सूची की कोई अवधारणा नहीं है क्योंकि प्रक्रिया ने या तो पकड़ लिया है और रुकावट को नजरअंदाज कर दिया है या यह बाहर निकल गया है। आप नौकरी लिखकर निलंबित प्रक्रियाओं की सूची प्राप्त कर सकते हैं


यह दिलचस्प है कि मेरे पास ^ क्यू और ^ एस (आप की तरह) दिखा रहे हैं, लेकिन उन्होंने सेट किया है stty -ixonताकि वे गुजरें। मुझे लगता है कि वे बदल जाएंगे <undef>
अगली सूचना तक रोक दिया गया।

मुझे मेरे OS X बॉक्स या मेरे डेबियन लेन बॉक्स के मैन पेजों में SIGSUSP नहीं मिलता है। यह SIGTSTP लगता है।
dmckee --- पूर्व-संचालक बिल्ली का बच्चा

DEL - आह, योजना 9 ...
new123456

5

सही उत्तर के बहुत सारे, लेकिन कोई भी पूर्ण नहीं है।

  1. जैसा कि कई अन्य लोगों ने कहा है: कंट्रोल-सी आम तौर पर यूनिक्स सिग्नल सिगनेट भेजता है और डिफ़ॉल्ट व्यवहार (ऐसे प्रोग्राम जो इसे ओवरराइड नहीं करते हैं) "समाप्त प्रक्रिया" है। कार्यक्रम इस संकेत को अनदेखा कर सकता है या यदि इच्छा हो तो एक अलग कार्रवाई कर सकता है।
  2. आप कीबोर्ड से SIGQUIT को Control- \ के साथ भी भेज सकते हैं। यहां अंतर यह है कि डिफ़ॉल्ट रूप से प्रक्रिया एक कोर फ़ाइल लिख देगी, फिर छोड़ दें। कार्यक्रम इस संकेत को अनदेखा कर सकता है या यदि इच्छा हो तो एक अलग कार्रवाई कर सकता है।
  3. अत्यधिक पूर्वाग्रह के साथ समाप्त करने के लिए और प्रक्रिया को बिना रोकें आप SIGKILL का उपयोग करने के लिए, जो डिफ़ॉल्ट रूप से किसी भी कुंजी के लिए बाध्य नहीं है। इसके बजाय आप आम तौर पर इसे kill (1)कमांड का उपयोग करके भेजते हैं और सिग्नल को निर्दिष्ट करने के लिए अंदर भेजते हैं

    $ kill -9 <process ID>
    

    या mnemonically

    $ kill -KILL <process ID>
    

    यह सिग्नल सीधे ओएस द्वारा नियंत्रित किया जाता है और प्रोग्राम डिफ़ॉल्ट व्यवहार को ओवरराइड नहीं कर सकता है।

  4. यदि आपका शेल नौकरी पर नियंत्रण का समर्थन करता है तो यह निर्मित संस्करण का भी समर्थन कर सकता है killजो कैटवॉक के उत्तर% में चरित्र का उपयोग करके नौकरी की पहचान का समर्थन करता है ।

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

इसके अलावा, SIGQUIT पर डंपिंग कोर कई प्रशासनिक विवरणों पर निर्भर करता है। ulimit -c, Solaris आदि पर coreadm (1M) - एक और नोट - fg SIGCONT सिग्नल भेजता है, जो इस प्रक्रिया को फिर से शुरू करता है जो ऑपरेशन है।
तदेउस्ज़ ए। कदलोबोस्की

1
  1. पृष्ठभूमि प्रक्रियाओं की सूची देखने के लिए: jobs

    मारने के लिए: kill %1( jobsआउटपुट में इसी जॉब आईडी के साथ 1 विकल्प )

  2. यहाँ देखें

1

Ctrl-C SIGINT भेजता है, जो डिफ़ॉल्ट रूप से एक प्रक्रिया समाप्त होने का कारण बनता है, लेकिन फंस सकता है (में \bin sh, का उपयोग करके trap)।

SIGKILL असत्य मार संकेत है।

तीसरी बार संपादित करें , मुझे लगता है कि यह सही है: मैंने डॉक्स के खिलाफ सब कुछ जांच लिया है। हम देखेंगे।


SIGKILL ट्रैपबल नहीं है।

हां। मैंने पहले ही तय कर लिया है कि ...
चार्ल्स स्टीवर्ट

1

यह अधिकांश टर्मिनल newbies के लिए स्पष्ट नहीं है, लेकिन अगर आपका मुद्दा सिर्फ यह है कि आप एक इंटरैक्टिव प्रोग्राम में हैं और आप यह पता नहीं लगा सकते हैं कि कैसे बाहर निकलना है, तो अक्सर qबाहर निकल जाएगा। उदाहरण के लिए, यह बाहर निकलने की कुंजी है less, जो कि जब आप manपृष्ठों को देखते हैं , तो अन्य चीजों के अलावा आपको मिलने वाला कार्यक्रम भी होता है ।

कुछ कार्यक्रमों में बाहर निकलने के लिए अन्य कीबोर्ड शॉर्टकट हैं। में vimया vi, का उपयोग करें ESC:wq। में emacs, उपयोग करें Control-C Control-X। में nanoया pico, का उपयोग करें Control-X। ध्यान दें कि इन उदाहरणों में, विशेष रूप से सूक्ष्मताएं हैं, इस विषय में कि वे शॉर्टकट आपके द्वारा संपादित की गई फ़ाइल में किए गए किसी भी परिवर्तन को बचा सकते हैं या नहीं।


तो मानक क्या है?
पचेरियर

0

कई प्रक्रियाएं बाधा सिग्नल को पकड़ने के लिए एक इंटरप्ट हैंडलर स्थापित कर सकती हैं, लेकिन जो डिफ़ॉल्ट रूप से गर्भपात नहीं करेंगे।

किसी प्रक्रिया को छोड़ने के लिए बाध्य करने के लिए, आप SIGQUIT (Ctrl- \) भेज सकते हैं।


SIGQUIT फंस सकती है, SIGKILL नहीं हो सकती।
चार्ल्स स्टीवर्ट

1
@Charles: एक और अंतर यह है कि SIGQUIT डिफ़ॉल्ट रूप से कोर डंप करता है, SIGKILL नहीं करता है।
तेदुस्ज़ ए। कदलोबोस्की

0

ऐसा लगता है कि अन्य उत्तर संभावित परिदृश्य हैं, लेकिन यह भी संभव है कि आप एक स्क्रिप्ट निष्पादित कर रहे हैं जो अपने बच्चों को सही तरीके से नहीं संभालती है। मैंने हाल ही में एक समान परिदृश्य मारा, जहां स्क्रिप्ट को मारना उस स्क्रिप्ट की बाल प्रक्रियाओं को नहीं मारता।

सामान्य तौर पर, यदि आप इस स्थिति में आते हैं, तो आपको उन सभी प्रक्रियाओं की समीक्षा करनी होगी जो आप चला रहे हैं। आपको पीएस के लिए मैनपेज की समीक्षा करनी चाहिए। ( man ps) मुझे विशेष रूप से उपयोग करना पसंद है ps auxwf, जो प्रक्रियाओं के बीच माता-पिता / बच्चे के संबंध को दर्शाता है। pstreeकुछ ऐसा ही करता है। प्रक्रिया को मारने से पहले आपको इसे दूसरे टर्मिनल से चलाना चाहिए, यह देखने के लिए कि सामान्य स्थिति में क्या चीजें दिखती हैं, और बाल प्रक्रियाओं की पहचान करें।

यदि आप उस मुख्य प्रक्रिया को (^ C के साथ) मारते हैं, तो ps के आउटपुट को फिर से देखें कि क्या कुछ बदल गया है या नहीं। यदि बच्चे की प्रक्रियाएं अभी भी आस-पास हैं, तो आप उन्हें killकमांड से मार सकते हैं । (देखें man kill)

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