linux: बैकग्राउंड टास्क को मारें


194

मैं लिनक्स में अंतिम स्पॉन्ड बैकग्राउंड टास्क को कैसे मार सकता हूँ?

उदाहरण:

doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????

18
यह प्रोग्रामिंग से संबंधित कैसे नहीं हो सकता है? बैश प्रोग्रामिंग प्रोग्रामिंग नहीं है?
फ्लाईबीवायर

6
यह एसओ और एसयू के बीच ओवरलैप क्षेत्र में है, लेकिन मुझे लगता है कि यह एसओ पर बेहतर है। इस तरह से सोचने के लिए मेरा मानदंड यह है कि अगर @flybywire किसी स्क्रिप्ट में ऐसा कर रहा है, तो यह प्रोग्रामिंग है। अगर वह सिर्फ कमांड लाइन से करना चाहता था, तो मैं कहता हूं कि यह एसयू पर है।
छिपकली

10
शेल स्क्रिप्टिंग प्रोग्रामिंग भी है।
cletus

जवाबों:


234

बैश में इसके लिए एक विशेष चर है:

kill $!

$! पृष्ठभूमि में निष्पादित अंतिम प्रक्रिया के पीआईडी ​​तक फैलता है।


68
@ polm23; नहीं, ^Zपृष्ठभूमि की नौकरियां नहीं हैं, यह उन्हें रोकता है। एक बाद bgमें वास्तविक 'बैकग्राउंडिंग' (पृष्ठभूमि में निष्पादन फिर से शुरू) करता है, और उसके बाद $!उम्मीद के मुताबिक काम करता है।
फाल्स्ट्रो

????हत्या के बाद एक या अधिक आदेशों के लिए खड़ा होने को मानते हुए , अगर उन आदेशों में से कोई भी पृष्ठभूमि प्रक्रिया द्वारा किए गए काम पर निर्भर करता है, तो किसी भी सफाई या परिष्करण-कार्यों के प्रति सावधान रहें, जो पृष्ठभूमि प्रक्रिया एक सिग्नल हैंडलर में प्रदर्शन कर सकती है एक जाल (संकेत) प्राप्त करना। इस तरह के किसी भी 'आश्रित' आदेशों में से पहले एक जोड़ने के लिए सबसे अच्छा wait(शायद syncया इसके बाद भी sleep <n>)।
एके

2
पूर्णता के लिए: एक% के रूप में भी वर्तमान नौकरी को संदर्भित करता है आप रुकी हुई नौकरी (^ z) को "किल%" से मार सकते हैं। मैं इसे लगभग हमेशा ^ z के बाद उपयोग करता हूं।
t3o

यह केवल तभी काम करता है जब आपके पास नौकरी-नियंत्रण सक्षम हो, जो केवल इंटरेक्टिव शेल में डिफ़ॉल्ट रूप से होता है (हालाँकि जब से आप ctrl-z का उपयोग करने की बात कर रहे हैं, तो मुझे लगता है कि आप एक इंटरैक्टिव शेल का उपयोग करने की बात भी कर रहे हैं) - लेकिन यह हो गया है यहाँ अन्य उत्तरों में उल्लिखित है, यह सुनिश्चित नहीं है कि यह "पूर्णता के लिए" क्यों है :)
फाल्स्ट्रो

289

आप नौकरी के नंबर से मार सकते हैं। जब आप किसी कार्य को पृष्ठभूमि में रखते हैं तो आपको कुछ इस तरह दिखाई देगा:

$ ./script &
[1] 35341

यह [1]नौकरी की संख्या है और इसे इस तरह संदर्भित किया जा सकता है:

$ kill %1
$ kill %%  # Most recent background job

जॉब नंबरों की सूची देखने के लिए jobsकमांड का उपयोग करें । इससे अधिक man bash:

शेल में किसी नौकरी को संदर्भित करने के कई तरीके हैं। चरित्र %एक नौकरी के नाम का परिचय देता है। जॉब नंबर के nरूप में संदर्भित किया जा सकता है %n। इसे शुरू करने के लिए उपयोग किए गए नाम के उपसर्ग का उपयोग करके या इसके कमांड लाइन में दिखाई देने वाले सबस्ट्रिंग का उपयोग करके एक नौकरी भी संदर्भित की जा सकती है। उदाहरण के लिए, %ceएक रुकी हुई ceनौकरी को संदर्भित करता है । यदि उपसर्ग एक से अधिक काम से मेल खाता है, तो बैश एक त्रुटि की रिपोर्ट करता है। %?ceदूसरी ओर, उपयोग करना , ceकमांड लाइन में स्ट्रिंग वाली किसी भी नौकरी को संदर्भित करता है । यदि विकल्प एक से अधिक कार्य से मेल खाता है, तो बैश एक त्रुटि की रिपोर्ट करता है। प्रतीकों %%और%+वर्तमान नौकरी के शेल की धारणा को देखें, जो कि पिछली नौकरी है, जबकि यह अग्रभूमि में थी या पृष्ठभूमि में शुरू हुई थी। पिछली नौकरी का उपयोग करके संदर्भित किया जा सकता है%-। नौकरियों से संबंधित आउटपुट में (उदाहरण के लिए, जॉब्स कमांड का आउटपुट), वर्तमान जॉब को हमेशा ए +और पिछले जॉब को ए के साथ फ्लैग किया जाता है -। एक एकल %(बिना नौकरी के विनिर्देश के साथ) वर्तमान नौकरी को भी संदर्भित करता है।


रिकॉर्ड के लिए, मुझे लगता है कि यह केवल तभी काम करता है जब नौकरी नियंत्रण सक्षम हो। हालांकि मुझे लगता है कि आप इसे स्क्रिप्ट में बदल सकते हैं ( set -m), यह इंटरैक्टिव उपयोग के लिए है। Stackoverflow.com/questions/690266/… को भी देखें
फॉल्सट्रो

9
बहुत उपयोगी प्रतीक, ये %1और %%- विशेष रूप से। कुछ चीजें Ctrl-C पर नहीं मरती हैं, इसलिए आपको उन्हें Ctrl-Z करने की आवश्यकता है, और फिर kill -9 %%। एक उदाहरण जहां मैंने इसे उपयोगी पाया है: while true; do mplayer <some unstable online radio>; date >> restarts.log; done- Ctrl-C आपको अगले लूप पुनरावृत्ति में ले जाएगा। इससे पहले कि मैं psया शायद करना था jobs -l, और फिर पीआईडी ​​टाइप करें, जो थकाऊ है।
टॉमस गैंडर

क्या सभी नौकरियों के लिए एक है?
CMCDragonkai

3
@TomaszGandor यही कारण है कि आप के while trueसाथ प्रतिस्थापित करना चाहते हो सकता है while sleep 1। यह आपको पुनरारंभ करने से पहले एक छोटी सी देरी देगा यदि आप उस के साथ रह सकते हैं, और यदि आप दो बार ctrl-c मारते हैं, तो दूसरा नींद को बाधित करेगा, इसे गैर-शून्य निकास के साथ समाप्त करेगा और लूप से बाहर निकलेगा।
फाल्स्ट्रो

45

निम्न आदेश आपको अपने सत्र में सभी पृष्ठभूमि प्रक्रियाओं की सूची देता है, साथ ही साथ पिड भी। फिर आप इस प्रक्रिया को मारने के लिए इसका उपयोग कर सकते हैं।

jobs -l

उदाहरण उपयोग:

$ sleep 300 &
$ jobs -l
[1]+ 31139 Running                 sleep 300 &
$ kill 31139

25

यह सभी पृष्ठभूमि प्रक्रियाओं को मारना चाहिए:

jobs -p | xargs kill -9

1
यह वही है जो मैं पहले उपयोग करूंगा, लेकिन kill -9 %%टाइपिंग कम है :)
टॉमाज़ गैंडर

4
@TomaszGandor जो केवल वर्तमान नौकरी को ही मार देगा अर्थात अंतिम कार्य अग्रभूमि में बंद हो गया या पृष्ठभूमि में शुरू हो गया। जवाब में आदेश सभी नौकरियों को मार देगा।
bitek


2
skill doB

skill मार कमांड का एक संस्करण है जो आपको दिए गए मानदंडों के आधार पर एक या कई प्रक्रियाओं का चयन करने देता है।


0

आपको इसकी आवश्यकता है ... इसे खोजने के लिए "ps -A" का उपयोग करें।


0

यह विषय के उत्तर से बाहर है, लेकिन, जो रुचि रखते हैं, उनके लिए यह मूल्यवान है।

जैसा कि @ जॉन कुगेलमैन के जवाब में,% नौकरी विनिर्देश से संबंधित है। कैसे कुशलता से मिल जाए? कम & पैटर्न कमांड का उपयोग करें, लगता है कि आदमी कम पेजर (निश्चित नहीं है) का उपयोग करता है, मैन बैश टाइप &% में तो टाइप एंटर केवल लाइनों को दिखाएगा जिसमें '%' है, सभी को फिर से टाइप करने के लिए टाइप करें। फिर दर्ज करें।


-3

बस हत्यारे आदेश का उपयोग करें:

हत्या का कार्यनाम

अधिक जानकारी और अधिक उन्नत विकल्पों के लिए, "मैन किंडल" टाइप करें।


4
मुझे लगता है कि जब आप वास्तव में पीआईडी ​​के लिए आसान पहुंच रखते हैं तो किलॉल थोड़ा आक्रामक होता है। और खतरनाक, भी, खासकर अगर आप जड़ हैं
डेव वोग्ट

3
बहुत उपयोगी नहीं है, अगर आपके पास सिस्टम में कुछ उपयोगी चल रहा है, जबकि killall pythonया तो था killall java
टॉमस गैंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.