2009-10-26 108 views
153

如何殺死linux中最後衍生的後臺任務?linux:kill後臺任務

例子:

doSomething 
doAnotherThing 
doB & 
doC 
doD 
#kill doB 
???? 
+16

這怎麼可能不是編程相關? Bash編程不是編程? – flybywire 2009-10-26 13:14:52

+3

屬於超級用戶恕我直言。 – Hasturkun 2009-10-26 13:21:48

+5

這是在SO和SU之間的重疊區域,但我認爲它在這裏適合SO。我這樣思考的標準是,如果@flybywire在腳本中這樣做,它就是編程。如果他只是想從命令行執行它,我會說它屬於SU。 – 2009-10-26 19:58:49

回答

184

有一個特殊的變量爲此在bash:

kill $! 

$!擴展爲在後臺執行的最後一個進程的PID。

+16

這對於使用'^ Z'背景的作業不起作用。 – polm23 2012-10-12 05:38:22

+56

@ polm23;不,'^ Z'沒有後臺作業,它會阻止它們。隨後的'bg'做了實際的'背景'(在後臺恢復執行),之後'$!'按預期工作。 – falstro 2012-10-16 14:39:55

+0

假設'????'代表殺死後要執行的一個或多個命令,如果這些命令中的任何命令依賴於後臺進程完成的工作,請注意任何清理或完成後臺任務可能會在接收到(可捕獲)信號後在信號處理程序中執行。在任何這樣的「依賴」命令的第一個命令之前,最好添加一個「wait」(可能跟隨一個「sync」或者甚至是「sleep」)。 – ack 2016-01-30 03:02:06

1

你需要它的PID ......用 「PS -A」 找到它。

-1

只需使用killall命令:

killall TASKNAME

獲取更多信息和更多高級選項,輸入 「man killall」。

+4

我覺得當你實際上可以輕鬆訪問PID時,killall有點侵略性。而且也是危險的,特別是如果你是root的話。 – 2009-10-26 13:20:00

+2

如果你不得不'killall python'或者'killall java',並且在系統中有某些有用的東西在運行,那麼它不是很有幫助。 – 2014-05-02 13:15:29

2
skill doB 

skill是kill命令的一個版本,它允許您根據給定條件選擇一個或多個進程。

247

您可以按職位編號殺死。當你把一個任務在後臺,你會看到類似這樣的:

$ ./script & 
[1] 35341 

[1]是作業號,可以像被引用:

$ kill %1 
$ kill %% # Most recent background job 

要查看工作號碼列表使用jobs命令。更多來自man bash

有很多方法可以在shell中引用作業。字符%引入了一個作業名稱。工作號n可能是 簡稱爲%n。作業也可以使用用於啓動它的名稱的前綴或使用在其命令行中出現的子字符串來引用。例如,%ce指的是停止的ce作業。如果前綴匹配多個作業,則bash 會報告錯誤。另一方面,使用%?ce是指在其命令行中包含字符串ce的任何作業。如果 子字符串匹配多個作業,則bash會報告錯誤。符號%%%+引用了當前作業的外殼概念,這是當它處於前景中或在後臺開始時停止的最後一個作業。可以使用%-引用上一份工作 。在與作業相關的輸出中(例如,作業命令的輸出),當前作業始終爲 ,標記爲+,以及以前的作業爲-。單個%(沒有附帶的工作規範)也指 當前工作。

+0

爲了記錄,我認爲這隻適用於啓用作業控制的情況。雖然我認爲你可以用腳本('set -m')將其打開,但它是用於交互式使用的。請參閱http://stackoverflow.com/questions/690266/why-cant-i-use-job-control-in-a-bash-script – falstro 2013-11-18 10:23:36

+6

非常有用的符號,這些'%1'和'%%' - - 特別。有些事情不會在Ctrl-C上死掉,所以你需要按Ctrl-Z,然後kill -9 %%。我發現它有用的一個例子是:'雖然是真的;做mplayer <一些不穩定的在線廣播>; date >> restarts.log;完成' - Ctrl-C會讓你進入下一個循環迭代。在我必須執行'ps'或者''jobs -l'之前,然後重新輸入PID,這很乏味。 – 2014-03-04 14:27:19

+0

所有工作都有一個嗎? – CMCDragonkai 2014-04-17 04:50:46

40

以下命令爲您提供會話中所有後臺進程以及pid的列表。然後你可以用它來殺死這個進程。

jobs -l 

用法示例:

$ sleep 300 & 
$ jobs -l 
[1]+ 31139 Running     sleep 300 & 
$ kill 31139 
20

這應該殺死所有的後臺進程:

jobs -p | xargs kill -9 
+1

這是我以前使用的,但是'kill -9 %%'少輸入:) – 2014-03-04 14:29:44

+4

@TomaszGandor只會殺死當前作業,即上一個作業在前臺停止或在後臺啓動。答案中的命令將殺死所有作業。 – bitek 2014-05-02 10:52:04

+3

[不要殺死-9](http://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process) – lesmana 2015-02-22 18:32:27

0

這是一個不折不扣的話題答案,但是,對於那些有興趣誰,這也許有價值。

正如在@John Kugelman的回答中,%與工作規範相關。 如何有效地找到那個?使用較少的&模式命令,似乎男人使用較少的尋呼機(不太確定),在男人bash類型&%,然後鍵入回車將只顯示行包含'%',重新顯示所有,鍵入&。然後輸入。