Когда я использую 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 вот так:
monit -c monitrc -vv
monit -c monitrc start all -vv
monit -c monitrc start MyProgram -vv
(заранее извините за длинный ответ ^^)
Все правильно
Но когда я использую
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