我正在尝试启动程序(Resque),但是在写入pidfile之前需要花费一些时间。因此,我认为Monit认为该程序尚未启动,并在编写第一个程序的pidfile之前,先启动一个或两个以上的程序。
我仅在此过程中如何延迟Monit再次检查的时间?还是应该以其他方式解决这个问题?
我正在尝试启动程序(Resque),但是在写入pidfile之前需要花费一些时间。因此,我认为Monit认为该程序尚未启动,并在编写第一个程序的pidfile之前,先启动一个或两个以上的程序。
我仅在此过程中如何延迟Monit再次检查的时间?还是应该以其他方式解决这个问题?
Answers:
我仅在此过程中如何延迟Monit再次检查的时间?
您可以通过监看的“ SERVICE POLL TIME ”功能来实现
监控文档说
定期检查服务,时间间隔由
set daemon n
声明。检查的执行顺序与在.monitrc文件中写入的顺序相同,除非在服务之间设置了依赖关系,在这种情况下,服务层次结构可能会改变检查的顺序。
自定义服务轮询的方法之一是
每个[数字]循环
例:
check process resque with pidfile /your/app/root/tmp/pid/resque.pid
every 2 cycles
还是应该以其他方式解决这个问题?
我还做了最初的尝试,以监视monit的resque作业,因为monit是一个非常轻量级的守护程序,但最终还是由上帝来解决。我知道,与monit相比,GOD占用的资源更多,但在重新排序的情况下,我们发现它非常合适。
您可以在不同于默认间隔的时间间隔内检查特定服务...
请参阅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
with timeout 90 seconds
正是我想要的 谢谢。
您还可以检查某件事是否连续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'
(从这里)
我团队的成员提出了一个非常聪明的解决方案,该解决方案允许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"
当前版本的Monit(5.16)支持使用以下语法的启动脚本超时:
<START | STOP | RESTART> [PROGRAM] = "program"
[[AS] UID <number | string>]
[[AS] GID <number | string>]
[[WITH] TIMEOUT <number> SECOND(S)]
该文档说明:
在进行过程检查的情况下,Monit将最多等待30秒以完成开始/停止操作,然后放弃并报告错误。您可以使用TIMEOUT选项覆盖此超时。
这就是“超时”值的作用。
timeout
应同时适用于启动和重新启动。据我所知,它在Monit检查其以下内容之前存在延迟:a)运行中,b)创建了预期的PID文件,以及c)当前正在运行具有预期PID的进程。我遇到了一些问题,使其无法正常运行,其中指定的应用程序只是一个脚本,该脚本分叉了实际流程,然后在不知道流程发生了什么的情况下返回了该脚本。在这种情况下让它工作是很痛苦的。
START DELAY
。