Answers:
你可以通过结合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。用管道将列表杀死,就可以了:
ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9
etimes
更方便— serverfault.com/a/393476/67675
killall --quiet --older-than 1w process_name
您需要的所有信息都可以从中获取ps -ef
。请参见“ STIME”列。结合使用grep
以梳理所需的流程。此时,您可以使用cut
来获取所有匹配进程的pid,并将其传递给kill
。
如果您想了解更多详细信息,请告诉我。
如果您是root用户,请清除垃圾(/ proc / fs proc / stat ...)
find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;
进程启动时,它将在/ proc文件系统中创建一个目录。您可以使用find命令获取早于7天的目录并按以下步骤终止进程:
find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9
find: warning: you have specified the -maxdepth option after a non-option argument -user, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
原样生成此警告,并且没有其他输出:移动-maxdepth作为第一个输出,它将不返回任何进程,而且我肯定很多应该匹配。
这里没有人提到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
不知道这是否可行,但这应该是一个很好的起点。