6

概括

如何在 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 秒。

4

1 回答 1

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等待完成,这意味着触发太早并被拒绝。startunmonitormonitor

于 2015-12-29T05:35:14.510 回答