我在远程服务器上的 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 将其排除。