मैं उन सभी प्रक्रियाओं को मारना चाहता हूं जो मुझे मिलती हैं:
ps aux | grep my_pattern
यह कैसे करना है?
यह काम नहीं करता:
pkill my_pattern
मैं उन सभी प्रक्रियाओं को मारना चाहता हूं जो मुझे मिलती हैं:
ps aux | grep my_pattern
यह कैसे करना है?
यह काम नहीं करता:
pkill my_pattern
जवाबों:
उपयोग करें pkill -f
, जो कमांड लाइन के किसी भी भाग के लिए पैटर्न से मेल खाता है
pkill -f my_pattern
pkill
- सबसे आम गलती यह धारणा है कि प्रत्येक बाइनरी का केवल एक उदाहरण किसी भी समय मौजूद हो सकता है।
killall -m my_pattern
।
pgrep
पहले यह सत्यापित करने की सलाह देता हूं कि आप क्या मारने जा रहे हैं। आप pgrep -l
प्रक्रिया के नाम pgrep -a
देखने के लिए या पूर्ण कमांड लाइन देखने के लिए उपयोग कर सकते हैं । यह pkill के समान झंडे का उपयोग करता है। तो इस मामले में आप उपयोग कर सकते हैं pgrep -fa my_pattern
।
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
यह कोड क्या कर रहा है?
ps -ef
कंप्यूटर इस उपयोगकर्ता को दिखाई पर प्रक्रिया आईडी के की एक सूची तैयार करता है। पाइप grep उस स्ट्रिंग वाली पंक्तियों के लिए नीचे फ़िल्टर करता है। यह grep -v grep
कहता है कि इस प्रक्रिया का मिलान खुद नहीं हो रहा है। पाइप awk प्रिंट का कहना है कि पंक्तियों को डिफ़ॉल्ट सीमांकक व्हाट्सएप पर पंक्तियों को विभाजित करें और दूसरे कॉलम पर फ़िल्टर करें जो हमारी प्रक्रिया आईडी है। पाइप xargs उन सभी को kill -9
समाप्त करने के लिए उन सभी पिड को भेजने के लिए एक नई प्रक्रिया शुरू करता है।
उपरोक्त कोड कई कारणों से खराब, खतरनाक, बदसूरत और हैकिश है।
यदि कोड समाप्त हो रहा है, तो कोई भी डेटाबेस ऑप्स कर रहा है या कम संभाव्यता की दौड़ की स्थितियों के साथ सुरक्षित लेनदेन कर रहा है, कुछ समय का कुछ अंश, उस लेनदेन की परमाणुता को बर्बाद कर दिया जाएगा, जो अपरिभाषित व्यवहार का उत्पादन करेगा। किल -9 कोई कैदी नहीं लेता। यदि आपका कोड इसके प्रति संवेदनशील है, तो xargs kill
एक संचरित झंडे के साथ उस हिस्से को बदलने का प्रयास करें जो एक सुंदर शटडाउन का अनुरोध करता है, और केवल तभी जब उस अनुरोध को अस्वीकार कर दिया जाता है, अंतिम उपायkill -9
एक गैर शून्य संभावना है कि आप गलती से ऑपरेटिंग सिस्टम को समाप्त कर देंगे या एक असंबंधित प्रक्रिया में अपरिभाषित व्यवहार का कारण बन सकते हैं, जिससे पूरे सिस्टम अस्थिरता के लिए अग्रणी है क्योंकि ps -ef
हर संभव प्रक्रिया को सूचीबद्ध करता है जो मौजूद हो सकता है, और आपको यकीन नहीं हो सकता है कि कुछ अजीब 3 पार्टी लाइब्रेरी शेयर आपके प्रक्रिया का नाम, या कि पढ़ने और मारने -9 को निष्पादित करने के बीच के समय में, प्रक्रिया कुछ और बदल गई थी, और अब आपने गलती से कुछ यादृच्छिक प्रक्रिया को समाप्त कर दिया है जिसका आप इरादा नहीं करते थे।
लेकिन, यदि आप बहुत ही अनूठे नामों के साथ उनके लिए जोखिम और नियंत्रण को समझते हैं, और आप डेटा में कुछ गिराए गए लेनदेन या सामयिक भ्रष्टाचार के साथ ठीक हैं, तो 99.9% समय ठीक होने वाला है। यदि कोई समस्या है, तो कंप्यूटर को रिबूट करें, सुनिश्चित करें कि कोई प्रक्रिया टकराव नहीं है। यह इस तरह के कोड के कारण है जो तकनीकी समर्थन स्क्रिप्ट बनाता है: "क्या आपने अपने कंप्यूटर को पुनरारंभ करने का प्रयास किया है" एक स्तर 5 मेम।
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
यदि कोई तर्क नहीं दिया जाता है तो आप xargs कमांड को निष्पादित नहीं करना चाहते हैं।
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
उद्धरण के बिना, मेरी पहली पृष्ठभूमि में से केवल एक पृष्ठभूमि प्रक्रिया को मार दिया गया था। इसे चलाकर फिर से बाकी लोगों को मार डाला।
-r
विकल्प OS X पर मौजूद नहीं है, इसलिए ऐसा लगता है।
यदि आपको प्रक्रियाओं के उपयोग का चयन करने में अधिक लचीलेपन की आवश्यकता है
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
आप grep -e आदि का उपयोग कर सकते हैं।
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
(नोट भी कर सकते हैं रिफ्लेक्टरिंग; देखें मेरी टिप्पणी @ सिंथेसाइज़रपटेल के उत्तर पर)।
ps
रिटर्न तीन प्रक्रियाओं 123, 234, और 345 पर आता है, तो आप अपनी kill 123 234 345
पसंद rm
या cat
एकाधिक फ़ाइल तर्क दे सकते हैं ।
grep
for KILLPID in
ps कुल्हाड़ी | grep 'प्यूमा' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
grep को हटा देगा
प्रक्रिया को सूचीबद्ध करने के लिए आप निम्न कमांड का उपयोग कर सकते हैं
ps aux | grep -c myProcessName
यदि आपको उस प्रक्रिया की गिनती की जांच करने की आवश्यकता है तो चलाएं
ps aux | grep -c myProcessName |grep -v grep
जिसके बाद आप का उपयोग कर प्रक्रिया को मार सकते हैं
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }')
आप निम्न कमांड का उपयोग कर सकते हैं
kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
यदि आप प्रक्रिया आईडी खोजने का सिरदर्द नहीं लेना चाहते हैं, तो नाम से प्रक्रिया को मारने के लिए regexp का उपयोग करें। उदाहरण के लिए, क्रोम को मारने के लिए कोड निम्नलिखित चाल करेगा।
killall -r --regexp chrome
-r
या तो जरूरत है --regexp
, जो क्रमशः छोटे और GNU लंबे विकल्प हैं।
आप निम्न आदेश का उपयोग कर सकते हैं:
ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9
या
ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9
इससे मेरा काम बनता है।
बुरा प्रतीत होता है?
pkill `pidof myprocess`
उदाहरण:
# kill all java processes
pkill `pidof java`
एक सर्वर के लिए इसे करने का सबसे अच्छा तरीका मिला जो समर्थन नहीं करता है pkill
kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')
आपको लूप करने की आवश्यकता नहीं है।
इसका इस्तेमाल करने के लिए सबसे अच्छा और सबसे सुरक्षित है pgrep -f
के साथ kill
, या बस pkill -f
, grep
ing 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$"
मैंने यूजीन रीक का जवाब लिया और इसके साथ काम किया। मेरा कोड निम्नलिखित जोड़ता है:
ps ax
इसमें grep शामिल है, इसलिए मैंने इसे शामिल नहीं किया है grep -Eiv 'grep'
मैंने एक फ़ाइल बनाई है, जिसका नाम है 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
my_pattern
केवल नाम का एक विकल्प है, या इसमें कोई रेगेक्स विशेष वर्ण हैं?