मान लीजिए कि मेरे पास किसी भी प्रक्रिया के एक हजार या अधिक उदाहरण हैं (उदाहरण के लिए 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यहाँ बहुत अच्छा है। पैटर्न को परिष्कृत करने के लिए आप इसे बहुत सारे पैरामीटर दे सकते हैं।
pkillLinux, 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।