दिए गए आंशिक नाम के साथ सभी प्रक्रियाओं को कैसे मारें? [बन्द है]


619

मैं उन सभी प्रक्रियाओं को मारना चाहता हूं जो मुझे मिलती हैं:

ps aux | grep my_pattern

यह कैसे करना है?

यह काम नहीं करता:

pkill my_pattern

11
क्या my_patternकेवल नाम का एक विकल्प है, या इसमें कोई रेगेक्स विशेष वर्ण हैं?
स्वेन मार्नाच 24'12

जवाबों:


1314

उपयोग करें pkill -f, जो कमांड लाइन के किसी भी भाग के लिए पैटर्न से मेल खाता है

pkill -f my_pattern

7
@ जयन: यह अपनी हत्या में भी काफी अंधाधुंध है। यह आश्चर्यजनक रूप से
शरारत

1
@ जयन: आप मुझे समझाने नहीं जा रहे हैं :-) मुझे कई बार तृतीय-पक्ष लिपियों द्वारा जलाया गया है जो उपयोग करने पर जोर देते हैं pkill- सबसे आम गलती यह धारणा है कि प्रत्येक बाइनरी का केवल एक उदाहरण किसी भी समय मौजूद हो सकता है।
13

4
किसी भी मैक उपयोगकर्ताओं के लिए जो यह उत्तर पाते हैं, जैसे मैंने किया, मैक समकक्ष है killall -m my_pattern
ज़ेव ईसेनबर्ग

1
यदि आपके पास कई फांसी की प्रक्रियाएं हैं जो मार नहीं पाते हैं तो pkill -f -9 का बेरहमी से उन्हें मारना
MacK

18
मैं pgrepपहले यह सत्यापित करने की सलाह देता हूं कि आप क्या मारने जा रहे हैं। आप pgrep -lप्रक्रिया के नाम pgrep -aदेखने के लिए या पूर्ण कमांड लाइन देखने के लिए उपयोग कर सकते हैं । यह pkill के समान झंडे का उपयोग करता है। तो इस मामले में आप उपयोग कर सकते हैं pgrep -fa my_pattern
स्टडजेक

158

"MyProcessName" स्ट्रिंग से मेल खाते सभी प्रक्रियाओं को मारें:

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

स्रोत: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

यह कोड क्या कर रहा है?

ps -efकंप्यूटर इस उपयोगकर्ता को दिखाई पर प्रक्रिया आईडी के की एक सूची तैयार करता है। पाइप grep उस स्ट्रिंग वाली पंक्तियों के लिए नीचे फ़िल्टर करता है। यह grep -v grepकहता है कि इस प्रक्रिया का मिलान खुद नहीं हो रहा है। पाइप awk प्रिंट का कहना है कि पंक्तियों को डिफ़ॉल्ट सीमांकक व्हाट्सएप पर पंक्तियों को विभाजित करें और दूसरे कॉलम पर फ़िल्टर करें जो हमारी प्रक्रिया आईडी है। पाइप xargs उन सभी को kill -9समाप्त करने के लिए उन सभी पिड को भेजने के लिए एक नई प्रक्रिया शुरू करता है।

उपरोक्त कोड कई कारणों से खराब, खतरनाक, बदसूरत और हैकिश है।

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

  2. एक गैर शून्य संभावना है कि आप गलती से ऑपरेटिंग सिस्टम को समाप्त कर देंगे या एक असंबंधित प्रक्रिया में अपरिभाषित व्यवहार का कारण बन सकते हैं, जिससे पूरे सिस्टम अस्थिरता के लिए अग्रणी है क्योंकि ps -efहर संभव प्रक्रिया को सूचीबद्ध करता है जो मौजूद हो सकता है, और आपको यकीन नहीं हो सकता है कि कुछ अजीब 3 पार्टी लाइब्रेरी शेयर आपके प्रक्रिया का नाम, या कि पढ़ने और मारने -9 को निष्पादित करने के बीच के समय में, प्रक्रिया कुछ और बदल गई थी, और अब आपने गलती से कुछ यादृच्छिक प्रक्रिया को समाप्त कर दिया है जिसका आप इरादा नहीं करते थे।

लेकिन, यदि आप बहुत ही अनूठे नामों के साथ उनके लिए जोखिम और नियंत्रण को समझते हैं, और आप डेटा में कुछ गिराए गए लेनदेन या सामयिक भ्रष्टाचार के साथ ठीक हैं, तो 99.9% समय ठीक होने वाला है। यदि कोई समस्या है, तो कंप्यूटर को रिबूट करें, सुनिश्चित करें कि कोई प्रक्रिया टकराव नहीं है। यह इस तरह के कोड के कारण है जो तकनीकी समर्थन स्क्रिप्ट बनाता है: "क्या आपने अपने कंप्यूटर को पुनरारंभ करने का प्रयास किया है" एक स्तर 5 मेम।


15
यदि नाम से कोई प्रक्रिया नहीं मिलती है तो यह एक त्रुटि है। ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9यदि कोई तर्क नहीं दिया जाता है तो आप xargs कमांड को निष्पादित नहीं करना चाहते हैं।
एपिजेने

2
बस थोड़ा सा संशोधन, शायद प्रक्रिया नाम को उद्धृत करना बेहतर है: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 उद्धरण के बिना, मेरी पहली पृष्ठभूमि में से केवल एक पृष्ठभूमि प्रक्रिया को मार दिया गया था। इसे चलाकर फिर से बाकी लोगों को मार डाला।
अली हैदर

-rविकल्प OS X पर मौजूद नहीं है, इसलिए ऐसा लगता है।
डेनियल

52

यदि आपको प्रक्रियाओं के उपयोग का चयन करने में अधिक लचीलेपन की आवश्यकता है

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

आप grep -e आदि का उपयोग कर सकते हैं।


4
-1 आपको एक लूप की आवश्यकता नहीं है, आप बस kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(नोट भी कर सकते हैं रिफ्लेक्टरिंग; देखें मेरी टिप्पणी @ सिंथेसाइज़रपटेल के उत्तर पर)।
ट्रिपल जूल

11
@tripleee अपने downvote के साथ कोई समस्या नहीं है, लेकिन आप ऐसा एहसास, कि OQ था "मैं यह है कि मैं द्वारा प्राप्त सभी प्रक्रियाओं को बंद करना चाहते हैं: ps aux | ग्रेप my_pattern" है, जो मैं dutyfully स्वीकार कर लिया।
यूजेन रीक

किल एक बार में सभी प्रक्रियाओं को मार देगा, आपको इसके लिए लूप की आवश्यकता नहीं है। यदि psरिटर्न तीन प्रक्रियाओं 123, 234, और 345 पर आता है, तो आप अपनी kill 123 234 345पसंद rmया catएकाधिक फ़ाइल तर्क दे सकते हैं ।
ट्रिपल जूल

@tripleee मुझे हटाने का grep
उल्लेख है

for KILLPID in ps कुल्हाड़ी | grep 'प्यूमा' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; donegrep को हटा देगा
जस्टिन E

18

प्रक्रिया को सूचीबद्ध करने के लिए आप निम्न कमांड का उपयोग कर सकते हैं

ps aux | grep -c myProcessName 

यदि आपको उस प्रक्रिया की गिनती की जांच करने की आवश्यकता है तो चलाएं

ps aux | grep -c myProcessName |grep -v grep 

जिसके बाद आप का उपयोग कर प्रक्रिया को मार सकते हैं

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 

आप निम्न कमांड का उपयोग कर सकते हैं प्रक्रिया ps aux की सूची के लिए | grep -c myProcessName यदि आपको उस प्रक्रिया की गिनती की जाँच करने की आवश्यकता है तो ps aux चलाएं | grep -c myProcessName | grep -v grep जिसके बाद आप किल -9 $ (ps aux | grep -e myProcessName | awk '{प्रिंट $ 2}' का उपयोग करके प्रक्रिया को मार सकते हैं)
Nived Thanima

13

इसके अलावा आप उपयोग कर सकते हैं killall -r my_pattern-rविस्तारित नियमित अभिव्यक्ति के रूप में प्रक्रिया नाम पैटर्न की व्याख्या करें।

killall -r my_pattern

8

यदि आप pkill -f PATTERNथोड़ा बहुत खतरनाक हैं, तो मैंने ईज़किल को एक बैश स्क्रिप्ट लिखी, जो आपको यह चुनने के लिए प्रेरित करती है कि उन प्रक्रियाओं में से कौन सी प्रक्रियाएँ जो उस PATTERN से मेल खाती हैं जिन्हें आप मारना चाहते हैं।



4

यदि आप प्रक्रिया आईडी खोजने का सिरदर्द नहीं लेना चाहते हैं, तो नाम से प्रक्रिया को मारने के लिए regexp का उपयोग करें। उदाहरण के लिए, क्रोम को मारने के लिए कोड निम्नलिखित चाल करेगा।

killall -r --regexp chrome


1
आपको केवल -r या तो जरूरत है --regexp, जो क्रमशः छोटे और GNU लंबे विकल्प हैं।
बिगस्मोक

3

आप निम्न आदेश का उपयोग कर सकते हैं:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

या

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

इससे मेरा काम बनता है।


1
StackOverflow में आपका स्वागत है। कृपया अपनी कोड लाइनों के लिए 4-स्थान या टैब इंडेंटेशन का उपयोग करें ताकि वे कोड ब्लॉक के रूप में स्वरूपित हों। सबसे अच्छा संबंध है
याकॉव

2

बुरा प्रतीत होता है?

 pkill `pidof myprocess`

उदाहरण:

# kill all java processes
pkill `pidof java`

2

एक सर्वर के लिए इसे करने का सबसे अच्छा तरीका मिला जो समर्थन नहीं करता है pkill

kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')

आपको लूप करने की आवश्यकता नहीं है।


1

इसका इस्तेमाल करने के लिए सबसे अच्छा और सबसे सुरक्षित है pgrep -fके साथ kill, या बस pkill -f, greping psके उत्पादन गलत हो सकता है।

इसके ps | grepसाथ प्रयोग करने के विपरीत , जिसे आपको | grep -vपैटर्न ट्रिक्स को जोड़कर या उपयोग करके grep लाइन को फ़िल्टर करने की आवश्यकता है , pgrepबस डिज़ाइन द्वारा खुद को नहीं चुना जाएगा।

इसके अलावा, क्या आपका पैटर्न ps's UID/ USER, SDATE/ STARTया किसी अन्य कॉलम में दिखाई देना चाहिए , आपको आउटपुट में अवांछित प्रक्रियाएं मिलेंगी और उन्हें मारना होगा, pgrep+ pkillइस दोष से ग्रस्त नहीं होना चाहिए।

भी मैंने पाया कि killall -r/ -regexp मेरे रेगुलर एक्सप्रेशन के साथ काम नहीं किया।

pkill -f "^python3 path/to/my_script$"

man pkill


0

मैंने यूजीन रीक का जवाब लिया और इसके साथ काम किया। मेरा कोड निम्नलिखित जोड़ता है:

  1. ps ax इसमें grep शामिल है, इसलिए मैंने इसे शामिल नहीं किया है grep -Eiv 'grep'
  2. मानव-पठनीय बनाने के लिए कुछ इफ़्स और गूँज जोड़े।

मैंने एक फ़ाइल बनाई है, जिसका नाम है killserver, यहाँ यह दिया गया है:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

परिणाम

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything

0

यह रास्ता है:

kill -9 $(pgrep -d' ' -f chrome)

3
हालांकि यह कोड इस सवाल का जवाब दे सकता है कि समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है और उत्तर के दीर्घकालिक मूल्य में सुधार करेगा।
इगोर एफ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.