मान लीजिए कि मेरे पास किसी भी प्रक्रिया के एक हजार या अधिक उदाहरण हैं (उदाहरण के लिए vi
) चल रहा है। मैं एक सिंगल शॉट / वन लाइन कमांड / वन कमांड में उन सभी को कैसे मार सकता हूं?
मान लीजिए कि मेरे पास किसी भी प्रक्रिया के एक हजार या अधिक उदाहरण हैं (उदाहरण के लिए vi
) चल रहा है। मैं एक सिंगल शॉट / वन लाइन कमांड / वन कमांड में उन सभी को कैसे मार सकता हूं?
जवाबों:
अच्छे पुराने के साथ क्या गलत है,
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
और अन्य विविधताएँ, लेकिन बुनियादी स्तर पर, यह हमेशा मेरे लिए काम करती है।
echo kill -9 $pid
पहले की तरह चलाता हूं इसलिए मुझे पता है कि मुझे क्या मिल रहा है। मुझे यकीन नहीं है कि AIX में pkill
मेरी रोटी और मक्खन UNIX है। और क्या यह वास्तव में खराब है कि नीचे मतदान किया गया - विषम।
csh
हत्यारे का उपयोग करें,
killall vi
यह 'vi' नाम के सभी कमांड को मार देगा।
आप एक संकेत भी जोड़ सकते हैं, उदाहरण के लिए
killall -9 vi
killall -9 vi
killall
ठीक वही करती हैं जो नाम से पता चलता है ... यह init-process को मारता है।
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
आउटपुट में शामिल किए जाते हैं ।
pkill
यहाँ बहुत अच्छा है। पैटर्न को परिष्कृत करने के लिए आप इसे बहुत सारे पैरामीटर दे सकते हैं।
pkill
Linux, BSD और Solaris - afaik पर उपलब्ध है। तो यह एक बड़ा प्रसार की तुलना में है killall
।
सबसे आसान तरीका यह है कि पहले जांच लें कि आपको सही प्रक्रिया आईडी मिल रही है:
pgrep -f [part_of_a_command]
यदि परिणाम अपेक्षित है। साथ जाना:
pkill -f [part_of_a_command]
pgrep -f "command name"
दिलचस्प है कि किसी ने भी इसका उल्लेख नहीं किया। पिडोफ पारित प्रक्रिया के नाम से मेल खाती प्रक्रियाओं के अंतरिक्ष से अलग हुए पिंडों का उत्पादन करता है। जैसे, आप kill
बिना पाइपिंग के सीधे इसके आउटपुट का उपयोग कर सकते हैं । आर्क लिनक्स पर मैं का उपयोग करें
kill -9 $(pidof <proc name>)
इस समाधान के लिए नकारात्मक पक्ष यह है कि यह नियमित अभिव्यक्ति के उपयोग की अनुमति नहीं देता है।
मैं आपको सुझाव देना चाहूंगा pkill
।
उदाहरण के लिए: ps -ef | pkill -f command
मारने की सभी प्रक्रियाओं की सूची दिखाने के लिए पहले प्रयास करें pgrep
:
उदाहरण के लिए: ps -ef | pgrep -f command
ps -ef
में pkill
या के उत्पादन को पाइप करने का उद्देश्य क्या है pgrep
? ये कमांड मानक इनपुट से नहीं पढ़ते हैं।
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
pkill
से उपयोग करता हूंprocps
।