查找(并杀死)旧的进程

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

理想情况下,我希望find类似的东西,但对于过程。

系统是Debian的Linux,这将由cron脚本和运行,所以我没有什么大问题,但可以理解的真正的问题。

你可以用ps,awk和kill来完成这个工作:

ps -eo pid,etime,comm 

为您提供三列输出,包括进程PID,自进程启动以来的经过时间,以及不带参数的命令名称。 经过的时间看起来像这样:

 mm:ss hh:mm:ss d-hh:mm:ss 

由于您需要运行超过一周的进程,因此您需要查找与第三种模式匹配的行。 您可以使用awk通过运行时间和命令名来过滤进程,如下所示:

 ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' 

它将打印所有匹配已经运行7天以上的“mycommand”命令的pid。 pipe道列入杀,你已经完成:

 ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9 

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

所有你需要的信息都可以从ps -ef抓取。 请参阅“STIME”栏。 结合grep来整理你需要的stream程。 此时,您可以使用cut来抓取所有匹配进程的pid,并通过这些进程kill

请让我知道如果你想了解更多的细节如何做到这一点。

如果你是根,去掉垃圾(/ proc / fs proc / stat …)

 find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \; 

当一个进程启动时,它会在/ proc文件系统中创build一个目录。 您可以使用find命令获取超过7天的目录,并按如下方式终止进程:

 find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 

这里没有人提到ps-watcher 。 我认为你可以使用elapsed2sec函数比较$ start_time,但我不完全确定。 这是我的第一个想法:

 [myproc] occurs = every trigger = elapsed2secs('$start_time') > 7*DAYS action = <<EOT echo "$command has been running more than 7 days" | /bin/mail user\@host kill -TERM $pid EOT 

不知道这是否有效,但它应该是一个很好的起点。