查找(并杀死)旧进程

Rya*_*ner 11 linux debian kill process

基本上我需要能够扫描进程树并找到与某个名称匹配并开始运行一个多星期的进程。一旦我拥有它们,我就需要杀死它们。所有进程仍然被系统视为处于运行状态,只是不使用任何系统时间。他们通常也会永远处于这种状态。

理想情况下,我想要类似的东西,但对于流程。

系统是 Debian linux,这将由 cron 编写和运行,所以我对一些大但可以理解的东西没有真正的问题。

Ian*_*and 9

你可以结合使用 ps 、 awk 和 kill 来做到这一点:

ps -eo pid,etime,comm
Run Code Online (Sandbox Code Playgroud)

为您提供三列输出,其中包含进程 PID、自进程启动以来经过的时间和命令名称,不带参数。经过的时间看起来像以下之一:

mm:ss
hh:mm:ss
d-hh:mm:ss
Run Code Online (Sandbox Code Playgroud)

由于您想要运行超过一周的进程,您将寻找与第三个模式匹配的行。您可以使用 awk 通过运行时间和命令名称过滤掉进程,如下所示:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'
Run Code Online (Sandbox Code Playgroud)

这将打印与“mycommand”匹配且已运行超过 7 天的所有命令的 pid。将该列表传送到 kill 中,您就完成了:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9
Run Code Online (Sandbox Code Playgroud)

  • 这不会向您显示运行“超过 7 天”的进程。它向您显示在 7 天但少于 8 天之间运行的进程。 (3认同)

bil*_*lyw 6

killall --quiet --older-than 1w process_name

  • 这在 Ubuntu 16.04 上效果很好,你可以使用 -i(交互式)标志来测试并确保它针对你认为应该是的进程。 (2认同)