基本上我需要能够扫描进程树并找到与某个名称匹配并开始运行一周以上的进程。一旦我拥有它们,我需要杀死它们。所有进程仍然被系统视为处于运行状态,只是不使用任何系统时间。他们通常也会永远处于这种状态。
理想情况下,我希望找到类似的东西,但对于流程。
系统是 Debian linux,这将由 cron 编写脚本和运行,所以我对一些大但可以理解的东西没有真正的问题。
基本上我需要能够扫描进程树并找到与某个名称匹配并开始运行一周以上的进程。一旦我拥有它们,我需要杀死它们。所有进程仍然被系统视为处于运行状态,只是不使用任何系统时间。他们通常也会永远处于这种状态。
理想情况下,我希望找到类似的东西,但对于流程。
系统是 Debian linux,这将由 cron 编写脚本和运行,所以我对一些大但可以理解的东西没有真正的问题。
你可以结合 ps 、 awk 和 kill 来做到这一点:
为您提供三列输出,其中包含进程 PID、自进程启动以来经过的时间和命令名称,不带参数。经过的时间看起来像以下之一:
由于您想要运行超过一周的进程,因此您将寻找与第三个模式匹配的行。您可以使用 awk 通过运行时间和命令名称过滤掉进程,如下所示:
这将打印所有与“mycommand”匹配的命令的 pid,这些命令已经运行了 7 天以上。将该列表导入 kill 中,您就完成了:
killall --quiet --older-than 1w process_name
您需要的所有信息都可以从
ps -ef
. 请参阅“时间”列。grep
将其与整理出您需要的流程相结合。此时,您可以使用cut
获取所有匹配进程的 pid 并将它们传递给kill
.如果您想了解有关如何执行此操作的更多详细信息,请告诉我。
如果您有一个要杀死的 Python/Perl/Ruby 脚本,
killall
那将无济于事,因为killall
只会查找“python”或“perl”,它无法匹配特定脚本的名称。要杀死所有超过 X 秒且完整运行命令的任何部分与字符串匹配的进程,您可以以 root 身份运行:
用于
ps
获取所有进程的列表 (-e
) 并仅输出 pid 和经过的秒数 (-o pid,etimes
)。grep -v PID
删除标题行。用于
awk
仅选择经过的秒数大于 43200 秒(12 小时)的行,并仅删除带有 PID 的第一列。将 PID 列表传回
ps
以获取完整的进程列表。用于
grep
查找包含要终止的脚本名称的行。再次使用
awk
拉出脚本的PID。如果找到任何进程,请杀死它们。
如果您是 root,请清除垃圾( /proc/fs proc/stat ...)
这里没有人提到ps-watcher。我认为您可以使用 elapsed2sec 函数比较 $start_time ,但我不完全确定。这是我的第一个想法:
不知道这是否有效,但这应该是一个很好的起点。
当一个进程启动时,它会在 /proc 文件系统中创建一个目录。您可以使用 find 命令获取超过 7 天的目录并终止进程,如下所示: