我正在寻找一种方法来终止所有已运行超过 X 时间的给定名称的进程。我生成了这个特定可执行文件的许多实例,有时它会进入错误状态并永远运行,占用大量 CPU。
我已经在使用 monit,但我不知道如何检查没有 pid 文件的进程。规则是这样的:
kill all processes named xxxx that have a running time greater than 2 minutes
Run Code Online (Sandbox Code Playgroud)
你会如何在 monit 中表达这一点?
eww*_*ite 85
在 monit 中,您可以对没有 PID 的进程使用匹配字符串。以名为“myprocessname”的进程为例,
check process myprocessname
matching "myprocessname"
start program = "/etc/init.d/myproccessname start"
stop program = "/usr/bin/killall myprocessname"
if cpu usage > 95% for 10 cycles then restart
Run Code Online (Sandbox Code Playgroud)
也许如果您在 10 个监视周期(每个 30 秒)内检查 CPU 负载是否处于某个级别,然后重新启动或终止,这可能是一个选项。或者您可以对与流程相关的文件使用monit 的时间戳测试。
没有具有该功能的即用型工具。假设您想终止运行时间超过一分钟的 php-cgi 脚本。做这个:
pgrep php-cgi | xargs ps -o pid,time | perl -ne 'print "$1 " if /^\s*([0-9]+) ([0-9]+:[0-9]+:[0-9]+)/ && $2 gt "00:01:00"' | xargs kill
pgrep
将按名称选择进程,ps -o pid,time
为每个 pid 打印运行时,然后分析行,从中提取时间,如果时间与定义的时间比较,则打印 pid。结果传给杀。