मैं पीआईडी ​​के बजाय नाम से एक प्रक्रिया को कैसे मार सकता हूं?


349

कभी-कभी जब मैं फ़ायरफ़ॉक्स शुरू करने की कोशिश करता हूं तो यह कहता है "फ़ायरफ़ॉक्स प्रक्रिया पहले से ही चल रही है"। इसलिए मुझे यह करना होगा:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

मैं जो चाहूंगा वह एक ऐसी आज्ञा है जो मेरे लिए सब कुछ करेगी। यह grepप्रक्रियाओं की सूची में एक इनपुट स्ट्रिंग और इसके लिए (या जो भी) ले जाएगा, और आउटपुट में सभी प्रक्रियाओं को मार देगा:

jeremy@jeremy-desktop:~$ killbyname firefox

मैंने इसे PHP में करने की कोशिश की, लेकिन exec('ps aux')केवल वही प्रक्रियाएँ दिखाता है जिन्हें exec()PHP स्क्रिप्ट में ही निष्पादित किया गया है (इसलिए केवल यही प्रक्रिया स्वयं दिखाई देती है।)


जब मुझे खिड़की मिलती है जो कहती है कि फ़ायरफ़ॉक्स पहले से ही चलता है तो मुझे आमतौर पर बस एक सेकंड इंतजार करना पड़ता है और मैं फ़ायरफ़ॉक्स को फिर से चला सकता हूं (बेशक यह हमेशा मामला नहीं हो सकता है)।
nuoritoveri

1
यह सबसे सुरक्षित तरीका है जैसा कि
जॉनबी


यह एक पुराना प्रश्न है, लेकिन क्या आप स्वीकृत उत्तर को बदल सकते हैं? आपने जो चिह्नित किया है वह कई प्रक्रियाओं के साथ विफल रहता है, जैसे कि जेवीएम द्वारा चलाया जाता है।
लुइस डी सूसा

इस विषय को संदर्भित करने वाले किसी व्यक्ति के लिए, उपरोक्त टिप्पणी में, लुइस नीचे दिए गए उत्तर को संदर्भित कर रहा है जो pkill -f "Process name"कमांड को टालता है ...
डिगर

जवाबों:


505
pkill firefox

अधिक जानकारी: http://linux.about.com/library/cmd/blcmdl1_pkill.htm


7
Pgrep का उपयोग यह पता लगाने के लिए कि आप हत्या से पहले क्या कर रहे हैं, जब आप हत्या की प्रक्रियाओं के आसपास जाते हैं, तो यह एक अच्छी बात है। विशेषकर उपयोग करते समय -f
अक्रिकोस

pkill बहुत अनुकूल नहीं है। आप इसे वैसे ही नाम नहीं दे सकते जैसे कि हत्यारे उन्हें लेते हैं।
ऑक्टोपस

2
pkill -U <username>काफी काम है। मेरे पास सोलारिस वेब सर्वर है, वास्तविक वेब सर्वर डेमन, यह स्वयं के उपयोगकर्ता के साथ सेवा के रूप में सेटअप है । तो उपयोगकर्ता द्वारा निर्दिष्ट करना पुनः आरंभ करने का एक सरल / आसान तरीका है।
Raystorm

6
मारने के लिए मजबूर करने के लिए: pkill -9 firefox
Justas

यह सबसे अच्छा समय में आधा काम करता है। आपको कम से कम -fएक सर्वव्यापी समाधान के लिए ध्वज की आवश्यकता है ।
लुइस डी सूसा

112

उपयोग करने के लिए भी संभव:

pkill -f "Process name"

मेरे लिए, इसने पूरी तरह से काम किया। यह वही था जिसकी मुझे तलाश है। pkill बिना ध्वज के नाम के साथ काम नहीं करता है।

जब -fसेट किया जाता है, तो पूर्ण कमांड लाइन का उपयोग पैटर्न मिलान के लिए किया जाता है।


2
शराब के साथ कुछ चलाने के लिए विशेष रूप से -fविकल्प वास्तव में आवश्यक है। जैसेpkill -f "EvilWindowsServer.exe"
कोडब्राउर

यह स्वीकृत उत्तर होना चाहिए। पहला उत्तर कई प्रकार के कार्यक्रमों के साथ विफल होता है, जैसे कि जेवीएम पर चलने वाले।
लुइस डी सूसा

1
मुझे -fपायथन स्क्रिप्ट चलाने वाली पृष्ठभूमि प्रक्रिया को मारने के लिए ध्वज को भी जोड़ना था ।
मेसन

मेरे मामले में, मुझे 2 झंडे चाहिए थे:pkill -f -9 PROCESSNAME
स्लाव

64

आप द्वारा प्रक्रियाओं को बंद कर सकते हैं नाम के साथkillall <name>

किंडल किसी भी निर्दिष्ट कमांड को चलाने वाली सभी प्रक्रियाओं के लिए एक संकेत भेजता है। यदि कोई संकेत नाम निर्दिष्ट नहीं है, तो SIGTERM भेजा जाता है।

संकेत या तो नाम (जैसे -HUP या -SUPUP ) या संख्या (जैसे -1 ) या विकल्प -s द्वारा निर्दिष्ट किए जा सकते हैं ।

यदि कमांड नाम नियमित अभिव्यक्ति (विकल्प -r ) नहीं है और इसमें एक स्लैश (/) है, तो उस फ़ाइल को मारने के लिए विशेष प्रक्रियाओं को निष्पादित किया जाएगा, जो उनके नाम से स्वतंत्र है।

लेकिन अगर आप इस प्रक्रिया को नहीं देखते हैं ps aux, तो संभवतः आपको इसे मारने का अधिकार नहीं होगा ...


6
किसी ऐसे प्रोग्राम को समाप्त करने के लिए बाध्य करना जो जवाब नहीं दे रहा है, किर्म को TERM के बजाय भेजें:killall -s KILL firefox
मार्टिन हेन्सन


25

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

pgrep -f [part_of_a_command]

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

pkill -f [part_of_a_command]

19

अजीब है, लेकिन मैंने इस तरह से समाधान नहीं देखा है:

kill -9 `pidof firefox`

यह भी कई प्रक्रियाओं (कई pids) को मार सकता है जैसे:

kill -9 `pgrep firefox`

मुझे पसंद है pidofक्योंकि इसमें सिंगल लाइन आउटपुट है:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

जब मैं इसे निष्पादित करता हूं, तो मुझे त्रुटि मिली है kill: invalid number 'pidof myprogram'। यहाँ क्या बुरा है ?.
ब्रेथोसल्ज़

इसने आज ही मेरी जान बचाई है ... मैं और लिखना नहीं चाहता, लेकिन मुझे खुशी है कि मैंने इसे यहाँ पाया। धन्यवाद दोस्त।
मिलिके

1
देर से आ रहा है, लेकिन मामले में किसी और को आश्चर्य होता है… @Brethlosze आप एकल टिक लगाते हैं, जबकि कमांड को बैकटिक्स की आवश्यकता होती है।
स्पेक्ट्रा

धन्यवाद! .. मैं (और मैं जा रहा हूँ) इन backticks के बारे में पता होगा :)
Brethlosze

13

snippetस्टार्टअप पथ में होने वाली सभी प्रक्रियाओं को मार डालो । आप एक स्निपेट के रूप में / निर्देशिका के लिए कुछ निर्देशिका से शुरू किए गए सभी ऐप को मार सकते हैं। यह काफी उपयोगी है जब आप एक ही एप्लिकेशन डायरेक्टरी से एक ही एप्लिकेशन के लिए कई कंपोनेंट्स शुरू करते हैं।

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

* यदि उपलब्ध हो तो मैं pgrep को प्राथमिकता दूंगा


1
यह एंटीपैटर्न का अक्सर देखा जाने वाला संयोजन है। एक regex का उपयोग करें जो स्वयं से मेल नहीं खाता (या स्क्रिप्ट का नाम) और एक बेकारgrep से बचें । ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
ट्रिपल

1
बेकार बकवास से बचने के दौरान आप टाइपो और स्वचालित प्रक्रियाओं में कमांड का उपयोग करने की क्षमता से परहेज नहीं कर रहे हैं जो <स्निपेट>
माइक

यह वास्तव में यह करने का सबसे अच्छा तरीका है!
अभिनंदन दुबे

यह समझना बहुत अच्छा होगा कि @ tripleee का [s]काम awk प्रक्रिया से मेल न खाने के संदर्भ में क्यों है?
औरिगं

क्योंकि रेगेक्स [x]yस्ट्रिंग से मेल खाता है xyलेकिन इसके विपरीत नहीं। यह एक सामान्य प्रश्न है। यह लिंक 20 से अधिक वर्षों से एक पृष्ठ पर है जो इसे और अधिक विस्तार से बताता है; और यह एक आवर्ती प्रश्न था।
ट्रिपलए

11

मैक पर मुझे pgrep और pkill नहीं मिल रहा था और न ही किलॉल वर्किंग कर रहा था इसलिए एक सरल एक लाइनर स्क्रिप्ट लिखी गई: -

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

यदि ऐसा करने का एक आसान तरीका है तो कृपया साझा करें।


1
जबरदस्त हंसी। यह इस तरह के कार्य के लिए एक पागल कमांड है। कोई बात नहीं। क्या आपने उस सरल एक लाइन को कॉल किया? : डी सिंपल
किलर है

@ erm3nda :-) सहमत हैं। पीछे मुड़कर देखने पर यह पागल लगता है। तब याद नहीं कर सकते कि हत्यारे मेरे मैक पर काम क्यों नहीं कर रहे थे।
धीरज

यह बहुत उपयोगी है जब आप "जावा" जैसी एक निश्चित जावा प्रक्रिया को मारना चाहते हैं। उस मामले में हत्यारे की मदद नहीं करता है।
Jan M


6

Grep के साथ मारने के लिए:

kill -9 `pgrep myprocess`

5

अधिक सही होगा:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid

1
आप exportएक चर क्यों बनाते हैं जिसे आप केवल उसी प्रक्रिया में एक बार उपयोग करने जा रहे हैं?
ट्रिपलए

4

मैं सामान्य रूप से killallकमांड का उपयोग करता हूं ।

इस कमांड के विवरण के लिए इस लिंक को देखें।


3

मैं अपने आप से एक ही सवाल पूछ रहा था, लेकिन वर्तमान जवाबों के साथ समस्या यह है कि वे सुरक्षित प्रक्रियाओं को नहीं मारते हैं ताकि उन्हें मारा जा सके ... इससे भयानक गलतियां हो सकती हैं:) ... खासकर अगर कई प्रक्रियाएं पैटर्न से मेल खाती हैं

एक अस्वीकरण के रूप में, मैं एक श समर्थक नहीं हूं और निश्चित रूप से सुधार के लिए जगह है।

इसलिए मैंने थोड़ी सी स्क्रिप्ट लिखी:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi

2

यदि आप गनोम चलाते हैं, तो आप विंडोज के तहत प्रक्रियाओं को मारने के लिए सिस्टम मॉनिटर (सिस्टम-> एडमिनिस्ट्रेशन-> सिस्टम मॉनिटर) का उपयोग कर सकते हैं। केडीई के समान कुछ होगा।


2

डिफ़ॉल्ट killआदेश PID के विकल्प के रूप में कमांड नामों को स्वीकार करता है। मार देखें (1) । अक्सर होने वाली परेशानी यह होती है कि वह bashअपने आप को प्रदान killकरता है जो नौकरी की संख्या को स्वीकार करता है, जैसेkill %1 , लेकिन नाम नहीं। यह डिफ़ॉल्ट कमांड में बाधा डालता है। यदि पूर्व कार्यक्षमता आपके लिए बाद की तुलना में अधिक उपयोगी है, तो आप bashकॉल करके संस्करण को अक्षम कर सकते हैं

enable -n kill

अधिक जानकारी के लिए killऔर बैश (1)enable में प्रविष्टियां देखें ।


मैंने कैसे कार्रवाई को फिर से लागू किया enable -n kill?
ब्रेथोसल्ज़

1
@hyprfrcbenable kill
Vee



0

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

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.