Как совместить проверку процесса и файла в monit? - PullRequest
6 голосов
/ 06 февраля 2012

Сводка

Как объединить несколько проверок в 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 голосов
/ 29 декабря 2015

Мне удалось сделать это, переопределив стартовую программу:

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 срабатывает слишком рано и отклоняется.

...