基本上,我需要能够扫描进程树并找到与特定名称匹配且一周前开始运行的进程。找到它们后,我需要终止它们。系统仍将所有进程视为处于运行状态,只是不占用任何系统时间。它们通常也会永远处于这种状态。
理想情况下,我希望找到类似的东西,但针对的是流程。
系统是 Debian linux,它将由 cron 编写脚本并运行,因此对于一些大型但可以理解的事情,我没有真正的问题。
答案1
您可以结合使用 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 }'
它将打印所有与 'mycommand' 匹配且已运行超过 7 天的命令的 pid。将该列表输入 kill 即可完成:
ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9
答案2
killall --quiet --older-than 1w process_name
答案3
您需要的所有信息都可以从 中获取ps -ef
。请参阅“STIME”列。将其与 结合起来,grep
找出您需要的进程。此时,您可以使用cut
获取所有匹配进程的 pid 并将其传递给kill
。
如果您想了解有关如何执行此操作的更多详细信息,请告诉我。
答案4
如果您是 root,请清除垃圾(/proc/fs proc/stat ...)
find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;