2011-06-17 73 views
171

假設我想殺死包含amarok這個詞的每個進程。我可以打印出我想要執行的命令。但是我怎麼才能讓shell執行它們。即。如何殺死所有與名稱匹配的進程?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}' 
Output: 
kill -9 3052 
kill -9 3071 
kill -9 3076 
kill -9 3077 
kill -9 3079 
kill -9 3080 
kill -9 3082 
kill -9 3083 
kill -9 3084 
kill -9 3085 
kill -9 3086 
kill -9 3087 
kill -9 3088 
kill -9 3089 
kill -9 4031 
+0

Add'| |在命令行的其餘部分之後是sh -x? – 2011-06-17 05:00:46

+3

在進程中永遠不會使用'kill -9'參見[進程管理] [1] [1]:http://mywiki.wooledge.org/ProcessManagement?highlight=%28%5CbCategoryUnix%5Cb%29#I .27m_trying_to_kill_-9_my_job_but_blah_blah_blah ... – 2011-06-17 08:14:51

+0

添加到上面的評論中,不僅是kill -9是一個糟糕的主意,而且還有一個事實,即您試圖通過其名稱殺死多個進程。對於一個過程的名稱沒有任何獨特之處,因此是識別的一個不好的候選者。 – 2014-12-02 21:47:06

回答

279

man 1 pkill

-f  The pattern is normally only matched against the process name. 
     When -f is set, the full command line is used. 

這意味着,例如,如果我們在ps aux中看到這些行:

apache 24268 0.0 2.6 388152 27116 ?  S Jun13 0:10 /usr/sbin/httpd 
apache 24272 0.0 2.6 387944 27104 ?  S Jun13 0:09 /usr/sbin/httpd 
apache 24319 0.0 2.6 387884 27316 ?  S Jun15 0:04 /usr/sbin/httpd 

我們可以使用pkill的-f選擇把他們全部殺死:

pkill -f httpd 
+0

我意識到這不能解決這個問題的主題,但它確實展示了一種替代的和更短的方法來做你正在嘗試的去做。 – 2011-06-17 04:19:08

+7

如需額外強度,請在末尾加上'-9'! – mlissner 2015-08-05 03:31:29

+0

在ubuntu中完美工作14.04 – zhihong 2015-09-03 08:22:39

166
ps aux | grep -ie amarok | awk '{print $2}' | xargs kill -9 

xargs的(1):xargs的 - 構造參數列表(一個或多個),並執行程序。當你想將參數傳遞給killls等等時很有用。

+3

提及xargs的要點 - 所有這些pgrep/pkill的東西都很好,但xargs是一個通用工具,在每個linux/unix上都是標準的。 – chrisdowney 2011-06-18 12:44:50

+2

「殺死:沒有這樣的進程」 – Cerin 2014-01-13 21:58:57

+2

Cerin這是因爲它試圖殺死grep進程,它已經完成。應該沒問題。 – 2014-06-18 23:47:54

40

使用pgrep

kill -9 $(pgrep amarok) 
+20

甚至是最好的:'pkill -9 amarok' – 2011-06-17 11:21:16

+1

pkill在本地處理「包含單詞」的每個進程部分,而不創建更多的管道或進程。查看完整進程名稱搜索的-f選項以消除對pgrep的需求。 – 2011-06-18 08:08:37

+2

我同意'pkill' – 2011-06-20 06:40:04

4

如果要執行一個命令的輸出,你可以把它裏面$(...),但是針對特定的任務來看看在killallpkill命令。

+0

+1指向killall – jm666 2011-06-17 09:23:24

3

您也可以評價爲一個子進程的輸出,通過周圍的背部蜱一切或把它裏面$():

`ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'` 

$(ps aux | grep -ie amarok | awk '{print "kill -9 " $2}')  
12

我覺得這個命令killall是你所需要的東西。 該命令被描述爲「殺死通過名稱過程」。它的易於使用。例如

killall chrome 

此命令將殺死Chrome.Here的所有過程是一個大約killall命令鏈接

http://linux.about.com/library/cmd/blcmdl1_killall.htm

希望這個命令可以幫助你。

19

的安全的方式來做到這一點是:

pkill -f amarok 
+1

要添加到此,我添加了'-l'標誌。我實際上只是將'pkill'命名爲'pkill -fl',這樣我就可以運行'pkill jboss'之類的東西了,它會吐出它剛剛殺死的進程。 – ndland 2015-12-10 16:45:00

+0

它也會殺死amarokx進程嗎?我玩vi,它殺死了'supervisorctl',其中包含'vi'的單詞。 – Gank 2015-12-12 02:44:38

8

pkill的-x進程名稱完全匹配。

pkill -x amarok 

pkill -f類似但允許正則表達式模式。

請注意,沒有其他參數(例如-x,-f)的pkill將允許在進程名稱上進行部分匹配。所以「pkill amarok」會殺死amarok,amarokBanana,bananaamarok等。

我希望-x是默認行爲!

+0

它也會殺死amarokx進程嗎?我玩vi,它殺死了'supervisorctl',其中包含'vi'的單詞。 – Gank 2015-12-12 02:43:58

+0

@Gank,是的,任何進程名稱與「amarok」在某處。 – user79878 2015-12-16 00:11:16

+0

如何殺死amarok而不是amarokx? – Gank 2015-12-16 05:14:18

3

嘗試殺-s 9 ps -ef |grep "Nov 11" |grep -v grep | awk '{print $2}'殺死11月11日 或 殺的過程-s 9 ps -ef |grep amarok|grep -v grep | awk '{print $2}' 殺死包含單詞的Amarok

0

也許添加命令可執行文件流程,設置+ X許可然後執行?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}' > pk;chmod +x pk;./pk;rm pk 
+0

這不提供問題的答案。一旦你有足夠的[聲譽](https:// stackoverflow。com/help/whats-reputation)你將能夠[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/16871558) – Parfait 2017-07-30 20:00:55