让monit等待更长的时间,然后再去考虑是否已死


20

我正在尝试启动程序(Resque),但是在写入pidfile之前需要花费一些时间。因此,我认为Monit认为该程序尚未启动,并在编写第一个程序的pidfile之前,先启动一个或两个以上的程序。

我仅在此过程中如何延迟Monit再次检查的时间?还是应该以其他方式解决这个问题?


我在下面添加了新答案。尽管在两次检查之间等待更长的时间可以防止因服务速度慢而发生冲突,但这对于客户而言确实是一个糟糕的体验。
艾迪(Eddie)2015年

Answers:


10

我仅在此过程中如何延迟Monit再次检查的时间?


您可以通过监看的“ SERVICE POLL TIME ”功能来实现

监控文档说

定期检查服务,时间间隔由

set daemon n

声明。检查的执行顺序与在.monitrc文件中写入的顺序相同,除非在服务之间设置了依赖关系,在这种情况下,服务层次结构可能会改变检查的顺序。

自定义服务轮询的方法之一是

  1. 基于轮询周期长度倍数的自定义间隔

每个[数字]循环

例:

check process resque with pidfile /your/app/root/tmp/pid/resque.pid
   every 2 cycles

还是应该以其他方式解决这个问题?


我还做了最初的尝试,以监视monit的resque作业,因为monit是一个非常轻量级的守护程序,但最终还是由上帝来解决。我知道,与monit相比,GOD占用的资源更多,但在重新排序的情况下,我们发现它非常合适。


谢谢!我最终使用了每个x周期。我刚刚找到了最适合我的电话号码。
拉蒙·塔亚格

19

您可以在不同于默认间隔的时间间隔内检查特定服务...

请参阅Monit文档中的SERVICE POLL TIME

您的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 * * * *

或者,如果启动缓慢,则可以在service start命令中延长超时时间:

check process apache with pidfile /var/run/httpd.pid
       start program = "/etc/init.d/httpd start" with timeout 90 seconds

相同的答案,对不对?
ewwhite 2012年

2
with timeout 90 seconds正是我想要的 谢谢。
andrew 2015年

1
包括超时和cron风格的荣誉。这是最准确和完整的答案。
RCross '16

9

您还可以检查某件事是否连续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'

从这里


1
这是另一个很好的答案,因为它显示了如何检查默认间隔,但只能在更宽容的基础上采取措施。
RCross

2

我团队的成员提出了一个非常聪明的解决方案,该解决方案允许monit经常(每分钟)检查一次,但是一旦尝试重新启动服务(大约需要10分钟),它将等待指定的宽限期,然后再尝试启动再次。

这样可以避免在两次检查之间等待太久,再加上启动缓慢,对客户的影响更大。它通过使用充当标记的中间脚本来工作,以指示monit已从上次失败开始采取措施。

check host bamboo with address bamboo.mysite.com
   if failed
           port 443 type tcpSSL protocol http
           and status = 200
           and request /about.action
            for 3 cycles
   then exec "/bin/bash -c 'ps -ef | grep -v "$$" | grep -v "grep" | grep restartBamboo.sh >/dev/null 2>&1; if [ $? -ne 0 ]; then /opt/monit/scripts/restartBamboo.sh; fi'"

如果Bamboo(缓慢启动的Web应用程序)连续3分钟关闭,请仅在尚未运行重新启动脚本的情况下重新启动BUT。

所调用的脚本具有指定的睡眠时间,等待更长的时间,然后等待该服务的最慢启动时间(在本例中,我们希望在〜10内完成,因此我们睡眠15分钟)

#!/bin/bash
echo "Retarting bambo by calling init.d"
/etc/init.d/bamboo stop
echo "Stopped completed, calling start"
/etc/init.d/bamboo start
echo "Done restarting bamboo, but it will run in background for sometime before available so, we are sleeping for 15 minutes"
sleep 900
echo "done sleeping"

2

当前版本的Monit(5.16)支持使用以下语法的启动脚本超时:

 <START | STOP | RESTART> [PROGRAM] = "program"
    [[AS] UID <number | string>]
    [[AS] GID <number | string>]
    [[WITH] TIMEOUT <number> SECOND(S)]

文档说明:

在进行过程检查的情况下,Monit将最多等待30秒以完成开始/停止操作,然后放弃并报告错误。您可以使用TIMEOUT选项覆盖此超时。

这就是“超时”值的作用。


如果实际启动需要很长时间,则延长超时有效,但在原始问题中,听起来程序可能已快速启动(即返回),但没有立即写出PID。有没有办法告诉monit重新启动后在指定的时间内不检查服务?
PeterVermont

timeout应同时适用于启动和重新启动。据我所知,它在Monit检查其以下内容之前存在延迟:a)运行中,b)创建了预期的PID文件,以及c)当前正在运行具有预期PID的进程。我遇到了一些问题,使其无法正常运行,其中指定的应用程序只是一个脚本,该脚本分叉了实际流程,然后在不知道流程发生了什么的情况下返回了该脚本。在这种情况下让它工作是很痛苦的。
jeteon's

重启系统并启动服务呢?有什么方法可以指定每个检查的初始延迟(以秒为单位)?也是没有开始/停止语句的被动检查
Massimo '18

我相信在这种情况下,您可能会寻找START DELAY
jeteon
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.