Answers:
在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
也许如果您检查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。结果传给杀人。
几年前,我使用ps-watcher解决了这个确切的问题,并在linux.com上写了有关它的内容。ps-watcher确实允许您监视进程并根据累积的运行时间将其终止。假设您的进程名为“ foo”,这是相关的ps-watcher配置:
[foo]
occurs = every
trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1
action = <<EOT
echo "$command accumulated too much CPU time" | /bin/mail user\@host
kill -TERM $pid
EOT
[foo?]
occurs = none
action = /usr/local/etc/foo restart
关键是线
trigger = elapsed2secs('$time') > 1*HOURS && $ppid != 1`
它说:“如果累计处理时间大于1小时,并且我不是父进程,请重新启动我。
因此,我意识到答案不使用监控,但可以使用。 ps-watcher轻巧且易于设置,因此运行monit设置无害。