在Linux中杀死用户的所有进程,除了少数几个

在Linux中杀死用户的所有进程,除了少数几个

我在远程服务器上的 screen 会话下运行了一些进程。当我尝试通过以下方式终止所有这些进程时:

pkill -U tim

我的所有进程都被终止了,包括那些我不想终止的进程(即屏幕和 ssh 连接)。

有没有办法可以终止除屏幕和 ssh 连接之外的所有进程?

答案1

有点黑客风格:

ps -U tim | egrep -v "ssh|screen" | cut -b11-15 | xargs -t kill

这将终止除 ssh 或 screen 进程之外的所有进程。以下是命令说明:

  • ps -U tim——显然,列出用户时间的每个进程
  • egrep -v "ssh|screen"-- 将删除带有 ssh 或 screen 进程的行
  • cut -b11-15-- 将剪切第 11-15 列中的数据(通常是 PID 所在的位置
  • xargs -t kill-- 将所有进程 ID 传递给 kill 命令

如果您更习惯使用 awk,您也可以使用它。

ps -U tim | egrep -v "ssh|screen" | awk '{print $2}' | xargs -t kill

答案2

据我所知,没有内置任何功能。您可以创建如下脚本:

#!/bin/bash
ps ux | sed -e '/bash/d' -e '/screen/d' | awk '{print $2}' | while read process
do 
  kill $process
done

如果你想避免终止其他进程,你只需要添加更多

-e '/processname/d'

sed 部分的条目。可能有更简洁的方法来处理它,但这种方法可行。

答案3

如果你经常终止所有进程,你可能需要调查为什么你需要这样做...但是嘿,这都是关于做事,而不是关于不是做事。

一个简单的解决方案是使用两个用户 ID...一个用于屏幕和您的 SSH 连接,另一个用于您在某些时候想要终止的所有进程。

这已经超出了“黑客行为”的范围,只是普通的“黑客行为”,但它还有一个额外的优势,即当您终止其他进程时,您以“连接”用户身份运行的任何其他程序都不会被终止。这可能包括错误日志的“尾部”和您可能希望保留的类似内容。

希望这可以帮助!

答案4

我使用了@RoyRico 的方法 - 由于缺乏声誉,无法对该帖子发表评论 - 并将其调整到我的系统中。由于一些不同的配置,它无法在现成的系统中工作。

ps -U myUserName | egrep -v "ssh|screen|grep|bash|systemd|(sd-pam)|ps" | awk '{print $1}' | tail -n +2 | xargs -t kill

好吧,我排除了更多我不想终止的进程。其次,PID 位于第一列,因此前面的“cut”命令完全错误地定位了(作为一种黑客式的解决方案,这是完全正常和可以接受的 ;) )。第三,在 grep 时,我将“PID”作为标题行,我使用 tail 将其排除。

相关内容