हर पृष्ठभूमि प्रक्रिया को समाप्त करें


10

मेरी कुछ Stoppedपृष्ठभूमि प्रक्रियाएं हैं।

kill $(jobs -p)और kill `jobs -p`कोई प्रभाव नहीं है

kill %1, kill %2आदि व्यक्तिगत प्रक्रियाओं को सफलतापूर्वक समाप्त करते हैं

मैं प्रत्येक पृष्ठभूमि प्रक्रिया को एक कमांड से कैसे मार सकता हूं?

इसके अलावा, पहले दो कमांड मेरे लिए काम क्यों नहीं करते?

मैं लिनक्स मिंट 15, 64 बिट चला रहा हूं

जवाबों:


10

जब वे दौड़ रहे हों

लगता है जैसे तुम killऔर उत्पादन के साथ ऐसा कर सकते हैं jobs -p

उदाहरण

$ sleep 1000 &
[1] 21952
$ sleep 1000 &
[2] 21956
$ sleep 1000 &
[3] 21960

अब मेरे पास 3 नकली नौकरियां चल रही हैं।

$ jobs
[1]   Running                 sleep 1000 &
[2]-  Running                 sleep 1000 &
[3]+  Running                 sleep 1000 &

उन सभी को ऐसे ही मार डालो:

$ kill $(jobs -p)
[1]   Terminated              sleep 1000
[2]-  Terminated              sleep 1000
[3]+  Terminated              sleep 1000

पुष्टि कर रहे हैं कि वे सभी चले गए हैं।

$ jobs
$

जब वे रुक गए

यदि आपके पास ऐसी नौकरियां हैं जो रुकी हुई हैं, तो नहीं कि आप इसके बजाय ऐसा कर रहे हैं।

उदाहरण

$ kill $(jobs -p)

$ jobs
[1]+  Stopped                 sleep 1000
[2]-  Stopped                 sleep 1000
[3]   Stopped                 sleep 1000

ठीक है ताकि उन्हें मारें नहीं, लेकिन ऐसा इसलिए है क्योंकि मार संकेत को स्वयं प्रक्रिया द्वारा नियंत्रित नहीं किया जा सकता है, इसे रोक दिया गया है। तो ओएस को इसके बजाय हत्या करने के लिए कहें। यही एक -9बात है।

$ kill -9 $(jobs -p)
[1]+  Killed                  sleep 1000
[2]-  Killed                  sleep 1000
[3]   Killed                  sleep 1000

वह बेहतर है।

$ jobs
$ 

जब कुछ चल रहे होते हैं और कुछ बंद हो जाते हैं

यदि आपके पास प्रक्रियाओं का एक मिश्रित बैग है जहां कुछ को रोका गया है और कुछ चल रहे हैं तो आप killपहले एक के बाद कर सकते हैं kill -9

$ kill $(jobs -p); sleep <time>; \
    kill -18 $(jobs -p); sleep <time>; kill -9 $(jobs -p)

यदि आप प्रक्रियाओं को पहले खुद को रोकने के लिए अनुमति देने के लिए अधिक समय की आवश्यकता के समय का विस्तार कर रहे हैं।

सिग्नल

न तो कोई HUP (-1) या SIGTERM (-15) को मारने में सफल होगा। लेकिन क्यों? ऐसा इसलिए है क्योंकि ये संकेत इस अर्थ में थोड़े हैं कि वे आवेदन को खुद को समाप्त करने के लिए कह रहे हैं। लेकिन जब से आवेदन एक बंद राज्य में है यह इन संकेतों को संसाधित नहीं कर सकता है। तो आप केवल एक पाठ्यक्रम (-9) का उपयोग करें।

आप सभी संकेतों को देख सकते हैं जो killप्रदान करता है kill -l

$ kill -l | column -t
1)   SIGHUP       2)   SIGINT       3)   SIGQUIT      4)   SIGILL       5)   SIGTRAP
6)   SIGABRT      7)   SIGBUS       8)   SIGFPE       9)   SIGKILL      10)  SIGUSR1
11)  SIGSEGV      12)  SIGUSR2      13)  SIGPIPE      14)  SIGALRM      15)  SIGTERM
16)  SIGSTKFLT    17)  SIGCHLD      18)  SIGCONT      19)  SIGSTOP      20)  SIGTSTP
21)  SIGTTIN      22)  SIGTTOU      23)  SIGURG       24)  SIGXCPU      25)  SIGXFSZ
26)  SIGVTALRM    27)  SIGPROF      28)  SIGWINCH     29)  SIGIO        30)  SIGPWR
31)  SIGSYS       34)  SIGRTMIN     35)  SIGRTMIN+1   36)  SIGRTMIN+2   37)  SIGRTMIN+3
38)  SIGRTMIN+4   39)  SIGRTMIN+5   40)  SIGRTMIN+6   41)  SIGRTMIN+7   42)  SIGRTMIN+8
43)  SIGRTMIN+9   44)  SIGRTMIN+10  45)  SIGRTMIN+11  46)  SIGRTMIN+12  47)  SIGRTMIN+13
48)  SIGRTMIN+14  49)  SIGRTMIN+15  50)  SIGRTMAX-14  51)  SIGRTMAX-13  52)  SIGRTMAX-12
53)  SIGRTMAX-11  54)  SIGRTMAX-10  55)  SIGRTMAX-9   56)  SIGRTMAX-8   57)  SIGRTMAX-7
58)  SIGRTMAX-6   59)  SIGRTMAX-5   60)  SIGRTMAX-4   61)  SIGRTMAX-3   62)  SIGRTMAX-2
63)  SIGRTMAX-1   64)  SIGRTMAX

मैं अत्यधिक, संकेत आदमी पृष्ठ पर एक नज़र लेने के लिए प्रोत्साहित करते हैं एक आप और भी अधिक विभिन्न संकेतों के बारे में जानना चाहते हैं man 7 signal


हमारे पास +पहली प्रक्रिया के -लिए प्रतीक और दूसरी प्रक्रिया के लिए प्रतीक और तीसरे में कोई प्रतीक क्यों नहीं है?
रमेश

मुझे आपके जैसे ही परिणाम मिले। हालाँकि, मैं terminateइसके बजाय चाहता हूं kill, क्योंकि मैंने पढ़ा है कि वह सुरक्षित है। मैंने कोशिश की kill -15 $(jobs -p), लेकिन इसका कोई असर नहीं हुआ। मैंने अनुमान लगाया कि रोकी गई प्रक्रियाओं को केवल मार दिया जा सकता है, लेकिन तब फिर kill %numberसे समाप्त हो जाता है (व्यक्तिगत) प्रक्रियाओं को रोक दिया।
user49888

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

@ user49888 - को kill -9 .. काम करना चाहिए। क्या प्रक्रियाएं हैं? क्या वे दोषपूर्ण या अनाथ प्रक्रियाएं हैं?
स्लम

1
@ user49888 - हाँ अगर प्रक्रिया किसी चीज़ के बीच में होती है तो उसे समाप्त होने से पहले कोई सफाई करने का अवसर नहीं दिया जाता है।
स्लम

2

आप यह कोशिश कर सकते हैं।

for x in `jobs -p`; do kill -9 $x; done

हालाँकि, यदि आप इस प्रक्रिया को समाप्त करना चाहते हैं, तो आप आदेश को जारी कर सकते हैं,

for x in `jobs -p`; do kill -15 $x; done

कमांड के विकी पेज से Kill,

एक प्रक्रिया को चार तरीकों से एक SIGTERM सिग्नल भेजा जा सकता है (इस मामले में प्रक्रिया ID '1234' है):

kill 1234
kill -s TERM 1234
kill -TERM 1234
kill -15 1234

प्रक्रिया एक भेजा जा सकता है SIGKILL तीन तरीकों से संकेत:

kill -s KILL 1234
kill -KILL 1234
kill -9 1234

जैसा कि इस उत्तर में बताया गया है , यह समाप्ति और मारने के बीच का अंतर है ।

टर्मिनेट सिग्नल, SIGTERM , एक सिग्नल है जिसे किसी प्रोग्राम में इंटरसेप्ट किया जा सकता है। अक्सर प्रक्रियाएं जो पृष्ठभूमि में चलने के लिए होती हैं, वे इस सिग्नल को पकड़ेंगी और शटडाउन प्रक्रिया शुरू करेंगी, जिसके परिणामस्वरूप स्वच्छ निकास होगा। मार संकेत, SIGKILL , को बाधित नहीं किया जा सकता है। जब इसे एक प्रक्रिया में भेजा जाता है तो इसके परिणामस्वरूप उस कार्यक्रम की समाप्ति हो जाएगी।

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


यह killहर पृष्ठभूमि की प्रक्रिया करता है। हालाँकि, क्या terminateउनके बजाय कोई रास्ता है , क्योंकि मेरा मानना ​​है कि सुरक्षित है?
user49888

यदि आप समाप्त करना चाहते हैं, तो आप -15किल कमांड में उपयोग कर सकते हैं ।
रमेश

-15यहां भी काम नहीं करेगा। मेरे ए
स्लम

@ रमेश - अंतिम 2 अनुच्छेद सही नहीं हैं। एक SIGTERM नहीं भेजा गया है (शुरू में नहीं)। प्रक्रियाओं को सर्विस स्टॉप / स्टार्ट स्क्रिप्ट के माध्यम से पहले रोकने का प्रयास किया जाता है। अगर ऐसा होता है कि एक प्रक्रिया को 9 भेजा गया था, तो प्रक्रियाओं के साथ बंद हो गया क्योंकि ओपी के उदाहरण kill -9में मेरे उदाहरण में काम नहीं किया गया होगा।
स्लम

1

ठीक है, इस के साथ खेलने के दौरान मैं देखता हूं कि जब आप एक काम को मारते हैं जो बंद हो जाता है (जहां निष्पादन को रोक दिया गया है, लेकिन समाप्त नहीं किया गया है), तो यह तब तक खत्म नहीं होगा जब तक कि इसे अग्रभूमि में नहीं लाया जाता। कार्यक्रम आम तौर पर दबाने से बंद कर दिया जाता है Ctrl- Zटर्मिनल पर। अधिकांश टर्मिनल SIGSTOPइस मामले में भेजते हैं , लेकिन निश्चित रूप से इसे भेजने के अन्य तरीके भी हैं जैसे कि kill -STOPया kill -19

प्रोग्राम को तुरंत समाप्त नहीं करना सामान्य व्यवहार है क्योंकि प्रोग्राम SIGTERMद्वारा भेजे गए डिफ़ॉल्ट सिग्नल को संसाधित करने के लिए चलना पड़ता है kill। इसके अलावा, कभी-कभी एक पृष्ठभूमि प्रक्रिया के लिए bashभेजने के बाद SIGTERM, यह किसी तरह बंद हो जाता है (हालांकि SIGTERMअभी भी लंबित है)।

सभी नौकरियों को प्राप्त करने का सबसे सुरक्षित तरीका ( बिना सहारा के kill -9) पहले SIGTERMएक सामान्य के साथ भेजना है kill, फिर SIGCONTकिसी भी शेष नौकरी में भेजना है, जैसे:

kill $(jobs -p)
kill -18 $(jobs -p)

SIGCONT( 18ताकि वे संसाधित कर सकते हैं संकेत संख्या है) अग्रभूमि में किसी भी बंद कर दिया नौकरियों लाएगा SIGTERMके रूप में वे आमतौर पर करते हैं।

यदि सभी कार्यक्रम इसके साथ समाप्त नहीं होते हैं, तो कुछ अन्य संकेत हैं जो आप कोशिश कर सकते हैं कि सहारा लेने से पहले सामान्य रूप से प्रक्रिया को समाप्त कर दें kill -9। पहले जो मैं सुझाता हूं SIGHUPवह बहुत सारे कार्यक्रमों के बाद से होता है जो आमतौर पर अन्य समाप्ति संकेतों को रोकते हैं जो प्रतिक्रिया देते हैं SIGHUP। यह आमतौर पर भेजा जाता है जब एक नियंत्रण टर्मिनल बंद हो जाता है, विशेष रूप से इसे तब भेजा जाता है जब एक sshसत्र ttyखत्म होता है। कई अंतःक्रियात्मक कार्यक्रम, जैसे कि गोले, अन्य समाप्ति संकेतों का जवाब नहीं देंगे, लेकिन यह तब तक होगा क्योंकि sshसत्र समाप्त होने के बाद (या किसी भी नियंत्रण टर्मिनल के बंद होने के बाद) उनके लिए यह समस्या बनी रहेगी । ऐसा करने के लिए आप ऐसा कर सकते हैं

kill -1 $(jobs -p)
kill -18 $(jobs -p)

निश्चित रूप से फिर से आपको यह सुनिश्चित करने की ज़रूरत है कि कार्यक्रम बंद नहीं किया गया है ताकि यह सिग्नल को संसाधित कर सके। अन्य समाप्ति संकेत आप कोशिश कर सकते हैं SIGINT( kill -2) और SIGQUIT( kill -3)। लेकिन निश्चित रूप से पूर्ण रेंज की कोशिश करने के लाभ कम हो जाते हैं और एक अपरिहार्य SIGKILL(उर्फ kill -9) हो सकता है।


यदि आप ऐसा करते हैं तो man signalआप इसे वापस करने के लिए संदर्भ सामग्री प्राप्त कर सकते हैं।
स्लम

यह मेरा A सुझाव का एक नरम रूप है। ऐसे उदाहरण हैं जहां मैंने अतीत में भाग लिया है जहां यह अभी भी पूरी तरह से चीजों को साफ नहीं करेगा इसलिए यदि आप ऐसा कर रहे हैं तो एक स्क्रिप्ट से kill -9 ..विधि ज्यादातर मामलों में काम करेगी। यह कभी-कभी प्रक्रियाओं को लटकाते हुए छोड़ देगा, इसलिए समय की अधिक विफलता होगी। यह एक व्यापार है जो आपको तय करना है। भारी होना और सब कुछ मारना बेहतर है, डेटा को साफ करना / सफाई करना बनाम एक नरम सफाई होना, लेकिन अधिक विश्लेषण करने के लिए क्योंकि आपके मारे गए उत्तरोत्तर अधिक कठोर हो जाते हैं।
स्लम

@ एसएलएम, आपको kill -9जब भी संभव हो इससे बचना चाहिए क्योंकि यह प्रोग्राम को ठीक से साफ करने का मौका दिए बिना प्लग को खींचता है। मैं कुछ विकल्पों के साथ अपडेट करूंगा।
ग्रीम

जैसा कि मैंने कहा कि आपका स्वाद नरम है, तो मैंने जो सुझाव दिया है, वह नीचे आता है कि आप क्या करने की कोशिश कर रहे हैं बनाम जोखिम के दृष्टिकोण से सहन करने के लिए तैयार हैं। मैंने आपके तरीके के साथ-साथ मेरा भी इस्तेमाल किया है। वे दोनों सही IMO हैं। भी ए kill ..; sleep <time>; kill -18 ..; नींद <समय>; किल -9 ... . Basically working up to the -9`।
स्लम

@ एसएलएम, kill -18निश्चित रूप से एक ऐसी चीज है जिसका उपयोग तब से किया जाना चाहिए क्योंकि नौकरियों को रोकना आम बात है (और कुछ मामलों में ऐसा प्रतीत होता है कि bashकिसी तरह भेजने से पहले नौकरी छोड़ना बंद कर देता है SIGTERM)। जैसा कि ऊपर जोड़ा गया SIGHUPहै, यह भी कोशिश कर रहा है क्योंकि कई प्रोग्राम जो दूसरों को जवाब नहीं देते हैं, वे इसका जवाब देंगे (इसे शेल के साथ आज़माएं)। हालांकि इससे परे, हां, यह इतना सार्थक नहीं है जितना SIGKILLसंभवत: अपरिहार्य है।
ग्रीम

0

यह आपके मौजूदा शेल की सभी नौकरियों को एक-एक करके समाप्त कर देगा:

while kill %; do :; done

स्पष्टीकरण: %सूची में अंतिम नौकरी को संदर्भित करता है, इसलिए यह तब तक लूप करेगा जब तक कि killगैर-शून्य मूल्य नहीं लौटाता है, जिसका अर्थ होगा कि समाप्त करने के लिए और अधिक नौकरियां नहीं हैं।

एक और दृष्टिकोण पहले भेजा जा सकता है SIGTERM, तो SIGCONTइसलिए आपकी नौकरियां जारी रह सकती हैं और पहली बात यह है कि वे आपका प्राप्त करेंगे SIGTERM

/bin/kill $(jobs -p) && /bin/kill -CONT $(jobs -p)

(किसी कारण से निर्मित killअजीब है, इसलिए मैंने यहां बाहरी उपयोग किया है)।

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