我正在尝试启动一个程序(Resque),但写入 pid 文件需要一些时间。因此,我认为 Monit 认为该程序尚未启动,并在写入第一个程序的 pid 文件之前启动了一个或两个程序。
我如何延迟 Monit 再次检查的时间,仅针对此过程?或者我应该以其他方式解决这个问题?
答案1
我如何延迟 Monit 再次检查的时间,只是为了这个过程?
您想要实现的目标可以通过“服务轮询时间“monit 的功能
Monit 文档说
服务会按照
set daemon n
语句。检查的执行顺序与 .monitrc 文件中写入的顺序相同,除非在服务之间设置了依赖关系,在这种情况下,服务层次结构可能会改变检查的顺序。
自定义服务轮询的方法之一是
- 根据轮询周期长度自定义间隔倍数
每 [数字] 个周期
例子:
check process resque with pidfile /your/app/root/tmp/pid/resque.pid
every 2 cycles
或者我应该用另一种方法解决这个问题?
我也曾尝试使用 monit 监控 resque 作业,因为 monit 是一个非常轻量级的守护进程,但最终还是选择了 GOD。我知道,我知道与 monit 相比,GOD 更耗资源,但就 resque 而言,我们发现它是一个很好的选择。
答案2
您可以按照不同于默认间隔的间隔检查特定服务......
看服务轮询时间在 Monit 文档中。
您的 Resque 程序的一个示例是检查不同数量的循环:
check process resque with pidfile /var/run/resque.pid
every 5 cycles
或者来自示例部分:
Some servers are slow starters, like for example Java based Application Servers.
So if we want to keep the poll-cycle low (i.e. < 60 seconds) but allow some services to take its time to start,
the every statement is handy:
check process dynamo with pidfile /etc/dynamo.pid every 2 cycles
start program = "/etc/init.d/dynamo start"
stop program = "/etc/init.d/dynamo stop"
if failed port 8840 then alert
或者您可以利用 cron 风格的检查。
check process resque with pidfile /var/run/resque.pid
every 10 * * * *
或者如果您遇到启动缓慢的情况,您可以在服务启动命令中延长超时时间:
check process apache with pidfile /var/run/httpd.pid
start program = "/etc/init.d/httpd start" with timeout 90 seconds
答案3
您还可以检查某件事是否连续 X 次失败:
if failed
port 80
for 10 cycles
then alert
或者在 Y 次民意调查中 X 次:
if failed
port 80
for 3 times within 5 cycles
then alert
或两者:
check filesystem rootfs with path /dev/hda1
if space usage > 80% for 5 times within 15 cycles then alert
if space usage > 90% for 5 cycles then exec '/try/to/free/the/space'
(从这里)
答案4
Monit 的当前版本(5.16)支持启动脚本的超时,语法如下:
<START | STOP | RESTART> [PROGRAM] = "program"
[[AS] UID <number | string>]
[[AS] GID <number | string>]
[[WITH] TIMEOUT <number> SECOND(S)]
这文档状态:
在进行进程检查的情况下,Monit 将等待最多 30 秒以完成启动/停止操作,然后放弃并报告错误。您可以使用 TIMEOUT 选项覆盖此超时。
这就是“超时”值的作用。