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

bus*_*ens 6 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Jay*_*yen 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
Run Code Online (Sandbox Code Playgroud)

这在 中有效monit/5.5,但在 中monit/5.14,它仅有时有效。由于在执行程序时monit/5.14接收到,因此它会在实际执行之前等待完成,这意味着过早触发并被拒绝。unmonitorstartstartunmonitormonitor