monit:不带pidfile的检查过程


36

我正在寻找一种方法来杀死运行了X倍以上时间的具有给定名称的所有进程。我产生了这个特定可执行文件的许多实例,有时它会进入不良状态并永久运行,占用大量CPU。

我已经在使用monit,但是我不知道如何在没有pid文件的情况下检查进程。规则将是这样的:

kill all processes named xxxx that have a running time greater than 2 minutes

您将如何以监事表达这一点?


您应在此处标记答案
ewwhite

Answers:


80

在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的时间戳测试


1
请注意:如果有多个流程,它将无法正常工作
ruX 16'Feb

1
您可以使用正则表达式:matchin“ otherstuff。* myprocessname”
user174962

@ruX:如果多个相关进程匹配,会发生什么?他们该如何处理?
kontextify

它需要第一场比赛。
ewwhite

5

没有具有该功能的现成工具。假设您想杀死运行时间超过一分钟的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。结果传给杀人。


处理运行过程中出现了长的时间变奇怪运行时(62-13:53:05),所以正则表达式语法分析运行时间应为([-0-9] +:[0-9] +:[0-9] + )-查看表达式开头的减号。
andrej 2014年

3

几年前,我使用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设置无害。



0

您可以将其作为exec语句用于monit。

    if [[ "$(uname)" = "Linux" ]];then killall --older-than 2m someprocessname;fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.