2013-03-16 29 views
47

是否有可靠的方法來殺死給定用戶的所有進程? kill(-1, SIGKILL),因爲該用戶將工作,除非該用戶的流氓進程首先殺死該查殺進程。到目前爲止我所能找到的最好的方法是循環訪問該用戶的system("ps -u"),並以這種方式殺死這些進程,但這看起來很詭異且效率低下。殺死給定用戶的所有進程

編輯:澄清,我特別要求一個POSIX兼容的解決方案。出於某種原因,我認爲標記問題posix會把它放在標題中。

+3

這是這裏值得一提的是,所有的解決方案(如通常是'kill'的情況下)有一個[TOCTOU(https://開頭CWE .mitre.org/data/definitions/367.html)競爭條件:在識別殺死它們的進程和殺死它們的進程之間,進程可能會死亡,其PID可能會被回收。或者該用戶擁有的新進程可能會產生,對您而言不爲人知。 – pilcrow 2015-09-09 18:20:47

回答

64

只是(臨時)殺了我的MacBook

killall -u pu -m . 

其中PU是我的用戶ID。在命令末尾觀察點。

也可以嘗試

pkill -u pu 

ps -o pid -u pu | xargs kill -1 
+0

謝謝,但AFAICT killall和pkill不屬於POSIX(見編輯我的問題) – 2013-03-16 17:23:11

+0

是我剛剛添加與POSIX的命令? – uselpa 2013-03-16 17:37:20

+0

啊,這是一個很好的!看起來像POSIX中定義的庫函數是不可能的,所以我會將其標記爲接受。 – 2013-03-17 00:32:45

1

迭代/ proc虛擬文件系統呢? http://linux.die.net/man/5/proc

+0

謝謝,但/ proc不是POSIX的一部分(請參閱編輯我的問題) – 2013-03-16 17:23:30

+0

@Shea Levy沒有問題,請記住,「ps -u」本身也不是POSIX,而是更多* nix的:) – 2013-03-16 17:30:23

+0

嗯,從我的閱讀http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html它似乎是... – 2013-03-17 00:31:30

27

這裏是一個班輪做這個,只是你想殺死事情的用戶名替換用戶名。甚至不要考慮在那裏紮根!

pkill -9 -u `id -u username` 

注意:如果你想要很好地移除-9,但它不會殺死所有類型的進程。

5

在Debian LINUX上,我使用:ps -o pid= -u username | xargs sudo kill -9

使用-o pid=可以抑制ps頭,並且輸出只是pid列表。據我所知,Debian shell是POSIX兼容。

0

下殺死該用戶創建的所有進程:

kill -9 -1 
+1

根據POSIX,kill -9 -1被解釋爲kill(-1,SIGKILL)。「如果pid爲-1,則sig應發送給進程有權發送該信號的所有進程(不包括未指定的一組系統進程)。」因此,通過標準(以及在macOS上的FWIW),這也將殺死殺死進程本身。 – 2017-11-21 12:06:58