2013-03-16 24 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