(извините за длинный ответ заранее ^^)
Получение Вещей Право
, Но когда я использую
check program
, Monit автоматически не запустит его. Если программа будет работать, и по некоторым причинам она останавливается с кодом выхода кроме 0, то monit не перезапустит ее (см. мою конфигурацию ниже).
существует значительная разница между process
и program
в Monit:
процесс А является двоичным файлом, работающим в фоновом режиме - демон (как HTTPD, сервер БД, и т.д.). Процесс не выполняется Monit. Monit действительно не управляет теми приложениями. Это может, однако, взаимодействовать с демоном-izer. Пример: systemctl start nginx
не выполнит nginx на переднем плане (и заблокирует Ваш удар), но запустит демона в фоне (который продолжает бежать даже после уничтожения сессии).
программа А является двоичным файлом, которым, выполняемым и управляет Monit. Эта программа должна выйти через какое-то время, и Monit воздействует, как все, что шло. Пример: du -hd1
выполнит, создаст вывод и выход. Вы можете затем, на основе кода состояния, содержание, и т.д., реагирует на результат/вывод выполнения.
Примечания по Конфигурации
Вы пытаетесь использовать check program
для daemonize Ваше приложение. Тот будет afaik не работать. Я думаю, что необходимо пойти для [1 112] в этом случае. Вам нужно к [1 129] демон ize Ваш сценарий для этого. Возвращение к этому позже...
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
Вот два действия, которые реагируют на то же событие. Это должно остановить и запустить скрипт. Возможно, что это будет работать, но довольно странно понять...
<час>Результат - Вид [1 130]
Лучший способ решить это состоял бы в том, чтобы иметь pidfile из Вашего сценария Python. Так как я не знаю s*it о Python, это ваше дело ;-)
А супергрязный способ создать себя, pidfile был бы сценарием (/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/
вместо [1 118] по причинам разрешения 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
самый большой дефект с этим подходом был бы возможным повторным использованием pids. Monit не имеет никакого соединения между изодромным с предварением файлом и двоичным файлом. Таким образом, если Ваш Python запустится с 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