Назад | Перейти на главную страницу

Мониторинг «проверка программы» и перезапуск на основе кода выхода

Когда я использую check process, monit запустит программу, которую я определил в start program тогда monit перезапустит его, если он остановится.

Но когда я использую check program monit не запустит его автоматически. Если программа запущена и по какой-то причине останавливается с кодом выхода, отличным от 0, monit не перезапустит ее (см. Мою конфигурацию ниже).

Я действительно не уверен, как правильно запускать и перезапускать программу на основе моих кодов выхода.

Мой файл конфигурации выглядит так:

set logfile /tmp/monit.log

set daemon  1
check program MyProgram with path “/monit/MyProgram.py”
        and with timeout 3600 seconds 
    every 1 cycles
    start program = “/monit/MyProgram.py” with timeout 3600 seconds
    if status > 200 then restart
    if status < 201 then stop
    if 2 restart 5 cycles then exec “/monit/custom_script.sh”
    if 2 restart 5 cycles then stop

и я попытался запустить monit вот так:

(заранее извините за длинный ответ ^^)

Все правильно

Но когда я использую check program Monit не запускает его автоматически. Если программа запущена и по какой-то причине останавливается с кодом выхода, отличным от 0, monit не перезапустит ее (см. Мою конфигурацию ниже).

Существует значительная разница между process и program в Моните:

Процесс это двоичный файл, работающий в фоновом режиме - демон (например, HTTPd, сервер БД и т. д.). Монит не запускает процесс. На самом деле Monit не контролирует эти приложения. Однако он может взаимодействовать с daemon-izer. Пример: systemctl start nginx не будет запускать nginx на переднем плане (и заблокировать ваш bash), но запустит демон в фоновом режиме (который продолжает работать даже после того, как вы завершили сеанс).

Программа это двоичный файл, выполняемый и управляемый Monit. Эта программа должна выйти через некоторое время, и Monit отреагирует на то, как все это происходит. Пример: du -hd1 запустится, создаст вывод и выйдет. Затем вы можете, основываясь на коде состояния, содержимом и т. Д., Реагировать на результат / вывод выполнения.


Примечания к конфигурации

Вы пытаетесь использовать check program чтобы демонизировать ваше приложение. Это не сработает. Я думаю, тебе нужно пойти на check process в таком случае. Тебе надо демонСоздайте свой сценарий для этого. Вернемся к этому позже ...

    if status > 200 then restart
    if status < 201 then stop

Monit должен взаимодействовать, если произойдет что-то необычное. Эта конфигурация сообщает Monit:

  • Происходит что-то необычное, если status > 200
  • Происходит что-то необычное, если status < 201

Это приводит к тому, что нет состояние успеха где все нормально. Вы будете держать себя в курсе событий;)

    if 2 restart 5 cycles then exec “/monit/custom_script.sh”
    if 2 restart 5 cycles then stop

Вот два действия, которые реагируют на одно и то же событие. Он должен остановиться и запустить сценарий. Возможно, это сработает, но это как-то странно понимать ...


Результат - Вид

Лучший способ решить эту проблему - получить файл pid из вашего скрипта python. Поскольку я ничего не знаю о python, решать вам ;-)

Супер-грязный способ создать себе pid-файл, который может быть сценарием bash (/monit/MyProgram-daemonize):

#!/usr/bin/env bash
(
    /monit/MyProgram.py &
    echo -n "$!" > "/tmp/MyProgram.pid"
) &

И еще один (/monit/MyProgram-kill):

#!/usr/bin/env bash

if [[ -f /tmp/MyProgram.pid ]]; then
    kill -SIGTERM $(cat /tmp/MyProgram.pid)
    wait $(cat /tmp/MyProgram.pid)
    rm -f /tmp/MyProgram.pid
    exit 0
fi

exit 1

Комментарии:

  • я использовал /tmp/ вместо того /run по причинам разрешения
  • я использовал kill -SIGTERM, так как kill -SIGKILL или kill -9 злы;) Возможно, вам придется это исправить ...

Ты можешь использовать check process затем:

check process MyProgram pidfile "/tmp/MyProgram.pid"
  start program = "/monit/MyProgram-daemonize" as uid myNonRootUserHere
  stop program = "/monit/MyProgram-kill" as uid MyNonRootUserHere

  if failed then restart
  if 3 restarts within 5 cycles then unmonitor

Самым большим недостатком этого подхода было бы возможное повторное использование pid. Monit не имеет связи между pid-файлом и двоичным файлом. Итак, если ваш питон запускается с pid 100 и все равно был убит, но другой процесс принимает pid 100, ваш Monit не заметит этого и подумает, что все в порядке. Для этого вам следует добавить проверку (примеры точно; если ваша программа не предоставляет HTTPd, эта проверка может быть не лучшим вариантом):

  if failed uid MyNonRootUserHere then restart

  if failed
    host 127.0.0.1
    port 80
    protocol http
    request "/"
  then alert