एक कमांड के साथ एक रनिंग प्रक्रिया के कई उदाहरणों को मारें


75

मान लीजिए कि मेरे पास किसी भी प्रक्रिया के एक हजार या अधिक उदाहरण हैं (उदाहरण के लिए vi) चल रहा है। मैं एक सिंगल शॉट / वन लाइन कमांड / वन कमांड में उन सभी को कैसे मार सकता हूं?


3
यह स्पष्ट नहीं है कि आप किन प्रणालियों को काम करने का इरादा रखते हैं। उदाहरण के लिए, लिनक्स पर मैं पैकेज pkillसे उपयोग करता हूं procps
हिरण हंटर

सवाल सामान्य दृष्टिकोण से पूछा गया था। मैं केवल दो प्रक्रियाओं को जानता था जैसे कि किलोल और आवक / सेड के माध्यम से। लेकिन मैं यह जानना चाहता था कि क्या इसे प्राप्त करने के अन्य तरीके हैं। यदि यह अलग-अलग प्रणालियों में अलग-अलग तरीके से किया जाता है, तो मैं जानना चाहता हूं कि किस में। यह Google के लिए बहुत बोझिल है, इसके बजाय मैंने आप सभी अनुभवी लोगों के साथ चर्चा करने के बारे में सोचा।
डार्क नाइट

जवाबों:


97

अच्छे पुराने के साथ क्या गलत है,

for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done

इसे और अधिक कुशल बनाने के तरीके हैं,

for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done

और अन्य विविधताएँ, लेकिन बुनियादी स्तर पर, यह हमेशा मेरे लिए काम करती है।


1
मतदान हुआ, केवल पहली भिन्नता का पता था। दूसरा अधिक कुशल दिखता है, धन्यवाद।
डार्क नाइट

5
@ TheDarkKnight इस पद्धति के साथ समस्या यह है कि आप अक्सर अपनी इच्छा से अधिक हत्याएं करते हैं। एक विश्वसनीय "कुछ खोज" लिखना मुश्किल है। लिनक्स के तहत, pkill का उपयोग करें , जो अधिकांश सूक्ष्मताओं को संभालता है।
जिल्स

मुझे यकीन नहीं है कि यह मुश्किल है, यदि आप एक विशिष्ट बाइनरी के बाद हैं तो यह बहुत विश्वसनीय हो सकता है। मैं हमेशा इसे echo kill -9 $pidपहले की तरह चलाता हूं इसलिए मुझे पता है कि मुझे क्या मिल रहा है। मुझे यकीन नहीं है कि AIX में pkillमेरी रोटी और मक्खन UNIX है। और क्या यह वास्तव में खराब है कि नीचे मतदान किया गया - विषम।
एइटबिटोनी

1
जब तक पूरी तरह से आवश्यक न हो, आपको SIGKILL के बजाय प्रक्रिया SIGTERM भेजनी चाहिए।

मुझे यह जोड़ना चाहिए कि ये 2 विधियां सभी गोले में काम नहीं करेंगी, उदाहरण के लिए यह काम नहीं करेगाcsh
नॉन सीक्वेंटर

38

हत्यारे का उपयोग करें,

killall vi

यह 'vi' नाम के सभी कमांड को मार देगा।

आप एक संकेत भी जोड़ सकते हैं, उदाहरण के लिए

killall -9 vi


यह सही है, आप अपनी इच्छा के अनुसार संकेत भी जोड़ सकते हैं, जैसेkillall -9 vi
होला सो ईदु फेलिज नावेद

1
मुझे नहीं लगता कि हत्यारे के लिए यह नासूर है: फ़ाइल द्वारा हत्या केवल निष्पादन योग्य कार्यों के लिए काम करती है जिन्हें निष्पादन के दौरान खुला रखा जाता है, यानी अशुद्ध निष्पादनयोग्य को इस तरह नहीं मारा जा सकता है। गैर-लिनक्स सिस्टम पर टाइपिंग किलर नाम का वांछित प्रभाव नहीं हो सकता है, खासकर जब एक विशेषाधिकार प्राप्त उपयोगकर्ता द्वारा किया जाता है। क्या होगा अगर मैं कुछ गैर-लिनक्स प्रक्रिया के बहुत सारे उदाहरणों को हटाने की कोशिश कर रहा हूं? किलॉल -w का पता नहीं चलता है कि क्या प्रक्रिया गायब हो जाती है और स्कैन के बीच उसी पीआईडी ​​के साथ एक नई प्रक्रिया द्वारा प्रतिस्थापित किया जाता है। यदि प्रक्रियाएँ अपना नाम बदल देती हैं, तो हो सकता है कि किलॉल सही ढंग से उनका मिलान न कर पाए।
डार्क नाइट

13
कृपया ध्यान रखें कि यह केवल लिनक्स और बीएसडी पर काम करता है। सोलारिस और कुछ अन्य प्रणालियां killallठीक वही करती हैं जो नाम से पता चलता है ... यह init-process को मारता है।
बॉबी

2
AIX पर, यह "उन सभी प्रक्रियाओं को रद्द कर देता है जो आपने शुरू की थीं, जो कि किल्लॉल प्रक्रिया का उत्पादन करने वालों को छोड़कर।"
एइटबिटोनी

31

pkillअगर यह उपलब्ध है, तो मैं क्या सुझाता हूं ( लिनक्स , फ्रीबीएसडी , नेटबीएसडी , ओपनबीएसडी , सोलारिस )। आप कमांड नाम से, पूर्ण कमांड लाइन या अन्य मानदंडों द्वारा प्रक्रियाओं को निर्दिष्ट कर सकते हैं। उदाहरण के लिए, pkill viउन सभी प्रोग्राम को मारता है जिनके कमांड नाम में सबस्ट्रिंग है vi। केवल viउपयोग की जाने वाली प्रक्रियाओं को मारने के लिए , उपयोग करें pkill -x vi। केवल viअंतिम प्रक्रिया को समाप्त करने के लिए कहे जाने वाले प्रक्रियाओं को मारने के लिए .confउपयोग करें pkill -fx 'vi.*\.conf'

पीआईडी ​​की सूची को देखने के लिए pkillजो सिग्नल भेजेगा, उपयोग करेगा pgrep, जिसमें बिल्कुल सिंटेक्स है सिवाय इसके कि वह सिग्नल नाम या संख्या को स्वीकार नहीं करता है। इन प्रक्रियाओं के बारे में अधिक जानकारी देखने के लिए, दौड़ें

ps -p "$(pgrep …)"

लिनक्स के तहत, आपको ps -p $(pgrep -d, …)इसके बजाय की आवश्यकता है (यह एक बग है: लिनक्स का psपॉसक्स-अनुरूप नहीं है)।

मारने के लिए प्रक्रियाओं की पहचान करने का एक और सामान्य तरीका वह प्रक्रियाएं हैं जिनमें एक निश्चित फ़ाइल खुली होती है (जो प्रक्रिया का निष्पादन योग्य हो सकती है)। आप इन्हें सूचीबद्ध कर सकते हैं fuser; fuser -kउन्हें एक संकेत भेजने के लिए उपयोग करें। उदाहरण के लिए, fuser -k /usr/bin/findसभी चल रहे isntances को मारता है find

यदि कोई भगोड़ा प्रक्रिया होती है जो कि बनी रहती है, तो आपको एक ही बार में पूरी प्रक्रिया समूह को मारना पड़ सकता है । एक प्रक्रिया समूह को उसके नेता के नकारात्मक द्वारा पहचाना जाता है, जो समूह में सभी प्रक्रियाओं की पूर्वज प्रक्रिया है। प्रक्रिया समूह को देखने के लिए जो एक प्रक्रिया से संबंधित है, चलाएं ps -o pgid(प्लस किसी भी विकल्प का चयन करें कि किस प्रक्रिया को प्रदर्शित करने के लिए) आप यह निर्धारित है कि आप, इस प्रक्रिया को समूह के नेता 1234 और उसके सभी बच्चों को मारने चलाना चाहते हैं kill -1234या kill -HUP -1234या किसी अन्य संकेत।

यदि आपको बेहतर तरीका नहीं मिल रहा है, तो psसभी प्रक्रियाओं को सूचीबद्ध करने के लिए उचित विकल्पों के साथ उपयोग करें और इसे grepया किसी अन्य टेक्स्ट फ़िल्टरिंग कमांड के साथ फ़िल्टर करें। ध्यान रखें कि गलती से अन्य प्रक्रियाओं से मेल न खाएं जो एक समान नाम के साथ कमांड चलाने के लिए होती हैं, या एक तर्क के साथ जिसमें यह नाम होता है। उदाहरण के लिए:

kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')

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


बहुत बहुत धन्यवाद, यह वास्तव में बहुत बढ़िया है। आपने जो दिया है वह एक तरह का ट्यूटोरियल है। एक बार फिर धन्यवाद । अप वोटेड
द डार्क नाइट

6

pkillयहाँ बहुत अच्छा है। पैटर्न को परिष्कृत करने के लिए आप इसे बहुत सारे पैरामीटर दे सकते हैं।


सभी यूनिक्स पर उपलब्ध नहीं है, और प्रश्न में विशिष्ट यूनिक्स या यूनिक्स जैसे ओएस का कोई उल्लेख नहीं है।
एइटबिटोनी

@EightBitTony pkillLinux, BSD और Solaris - afaik पर उपलब्ध है। तो यह एक बड़ा प्रसार की तुलना में है killall
निल्स

मैं सहमत हूं, लेकिन हत्यारे और भी अधिक समस्याग्रस्त हैं क्योंकि एक ही नाम के साथ कई उपकरण हैं, जो नाटकीय रूप से अलग-अलग व्यवहार करते हैं ऐसा प्रतीत होता है। मुझे हत्यारे के जवाब पसंद नहीं हैं। pkill AIX या HP-UX पर मौजूद नहीं है और इसके बावजूद कि कुछ लोग क्या मानते हैं, दुनिया में अभी भी नॉन-लिनक्स UNIX का एक महत्वपूर्ण आधार है।
ईटबिटोनी

1
@EightBitTony यही कारण है कि आपका उत्तर स्वीकार किया जाता है। लेकिन मैं इसका इस्तेमाल सोलारिस (जो यूनिक्स भी है) पर नहीं करूंगा।
निल्स

6

सबसे आसान तरीका यह है कि पहले जांच लें कि आपको सही प्रक्रिया आईडी मिल रही है:

pgrep -f [part_of_a_command]

यदि परिणाम अपेक्षित है। साथ जाना:

pkill -f [part_of_a_command]

या उपयोग:pgrep -f "command name"
मैग्नी

3

दिलचस्प है कि किसी ने भी इसका उल्लेख नहीं किया। पिडोफ पारित प्रक्रिया के नाम से मेल खाती प्रक्रियाओं के अंतरिक्ष से अलग हुए पिंडों का उत्पादन करता है। जैसे, आप killबिना पाइपिंग के सीधे इसके आउटपुट का उपयोग कर सकते हैं । आर्क लिनक्स पर मैं का उपयोग करें

kill -9 $(pidof <proc name>)

इस समाधान के लिए नकारात्मक पक्ष यह है कि यह नियमित अभिव्यक्ति के उपयोग की अनुमति नहीं देता है।


0

मैं आपको सुझाव देना चाहूंगा pkill

उदाहरण के लिए: ps -ef | pkill -f command

मारने की सभी प्रक्रियाओं की सूची दिखाने के लिए पहले प्रयास करें pgrep:

उदाहरण के लिए: ps -ef | pgrep -f command


1
ps -efमें pkillया के उत्पादन को पाइप करने का उद्देश्य क्या है pgrep? ये कमांड मानक इनपुट से नहीं पढ़ते हैं।
Kusalananda

0

नीचे दिए गए कमांड का उपयोग करके आप कई अलग-अलग प्रक्रियाओं को मार सकते हैं

pkill -9 -f "\.\/.+\s\.|process1|process2|process3\[^"

ध्यान दें कि यह उस प्रक्रिया को मार देगा जो उपरोक्त पैटर्न से मेल खाती है, साधन process1abc process2def process3ghiभी मारे जाएंगे।


-1

pgrep "name-of-application" | xargs kill -9

याद करने के लिए पर्याप्त सरल था और मेरे लिए अच्छी तरह से काम किया।



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