如何在monit中结合进程和文件检查?

时间:2012-02-06 18:20:08

标签: ubuntu upstart monit

摘要

如何在Monit中组合多个支票?我想检查流程活动和文件内容/时间戳。


漫长而无聊的解释

我正在使用Monit守护进程来保持我的Bukkit Minecraft服务器。它做了几次检查。目前我有这段代码:

#!monit

check process bukkit pidfile /var/run/bukkit.pid # check if the java process is running
    start program = "/sbin/start bukkit"         # start with Upstart
    stop program  = "/sbin/stop bukkit"          # stop with Upstart

    if failed                                    # send a noop request to check if the server responses
        host cubixcraft.de port 20059 protocol http
        and request "/api/call?method=runConsoleCommand&args=%5B%22noop%22%5D&key=d9c7f3f6be0c92c1b2725f0e5a3352514cee0885c3bf7e0189a76bbaf2f4d7a7"
            with checksum e006695c8da58e03f17a305afd1a1a32
            timeout 20 seconds for 2 cycles
    then restart                                 # restart if it fails

它有效...但它很慢。如果出现问题,我必须等待20秒才能终止服务器。但我需要超时,因为服务器会不时地进行一些重新加载(刷新配置,清理内存等),这会产生很小的延迟。没有timeout 20 seconds for 2 cycles,如果重新加载,服务器将被立即终止。

好吧,如果出现问题,等待20秒直到服务器重新启动对我来说没问题。但大多数情况下(出现问题时)服务器上的所有安全机制都会停止工作。

因此,如果它没有响应,我需要找到一种方法来重新启动服务器,但是当它重新加载时给它一些时间。

我有这种方法:当发出任何命令(包括用于检查服务器状态的重载和API调用)时,服务器会将某些内容写入日志文件。因此,日志文件的时间戳是最后一个命令的时间戳。在重新加载期间,没有任何内容写入文件。所以我可以通过简单的时间戳检查来检测重新加载,并且只有当服务器当前重新加载时才给它20秒。

1 个答案:

答案 0 :(得分:0)

我设法通过覆盖启动程序来做到这一点:

start program = "/bin/bash -c '/usr/bin/monit unmonitor bukkit; /sbin/start bukkit; sleep 20; /usr/bin/monit monitor bukkit'" with timeout 25 seconds

这适用于monit/5.5,但在monit/5.14中,它只在某些情况下有效。自monit/5.14 unmonitor start start unmonitor monitor {{1}} {{1}} {{1}}实际执行{{1}}后{{1}}等{{1}} }太早开火并被拒绝。