Вопрос или проблема
Я настроил мониторинг с помощью Monit. Однако у меня возникли проблемы с проверкой процесса. Если процесс не запущен, я хочу запустить конкретный скрипт, который создаст уведомление в PagerDuty.
Мой файл Monit выглядит так:
check process "myapp" matching "myapp"
start program = "/usr/local/myapp start"
stop program = "/usr/local/myapp stop"
if does not exist then exec "/bin/bash pagerduty_script 'MyApp Down' trigger"
Скрипт pagerduty_script
— это просто обертка, которая принимает два аргумента: "string event"
и действие trigger
.
Скрипт работает. Я тестировал его в терминале, и он выполняется нормально. События действительно создаются в PagerDuty. Однако, кажется, что Monit на самом деле его не запускает, хотя ни один процесс не работает:
ps -ef | grep myapp
vagrant 23950 23136 0 17:40 pts/0 00:00:00 grep --color=auto myapp
sudo monit status:
Process 'myapp'
status Execution failed
monitoring status Monitored
data collected Tue, 16 Sep 2014 17:40:11
Я не понимаю, почему это работает в консоли, но Monit на самом деле не генерирует событие.
Я сталкивался с подобной проблемой и выяснил, что скрипт pagerduty создает временный файл для триггера, и если этот файл был изменен не более 4 часов назад, он не перезапускает уведомление.
Возможно, когда вы выполняли это из консоли, вы уже создали временный файл. Вы можете это проверить, удалив временный файл непосредственно перед тем, как Monit должен сгенерировать уведомление.
Другим вариантом является использование другого уникального типа события, чтобы просто протестировать это.
Ответ или решение
Чтобы разобраться с проблемой, связанной с работой Monit после проверки "if does not exist", рассмотрим ключевые аспекты вашего сценария.
Проблема
Вы установили мониторинг с помощью Monit для процесса myapp
и хотите, чтобы при отсутствии этого процесса запускался скрипт, который создает оповещение в PagerDuty. Тем не менее, Monit не вызывает указанный скрипт, даже когда процесс действительно не работает.
Анализ конфигурации
Ваш конфигурационный файл Monit выглядит следующим образом:
check process "myapp" matching "myapp"
start program = "/usr/local/myapp start"
stop program = "/usr/local/myapp stop"
if does not exist then exec "/bin/bash pagerduty_script 'MyApp Down' trigger"
В этом коде вы правильно определили процесс и прописали команды для его старта и остановки. Однако возникает проблема с тем, что тот факт, что myapp
не работает, не приводит к вызову скрипта.
Возможные причины и решения
-
Состояние процесса:
Убедитесь, чтоmyapp
действительно не запущен. Командаps -ef | grep myapp
показывает, что нет запущенного процесса, кроме самой команды grep. Это подтверждает, что процесс отсутствует. -
Правильность пути к скрипту:
Проверьте, что путь к скриптуpagerduty_script
указан верно. Убедитесь, что Monit имеет права на выполнение этого скрипта. Добавьте полные пути к исполняемым файлам внутри вашего скрипта, чтобы избежать проблем с окружением. -
Логи Monit:
Проверьте логи Monit (обычно находятся по пути/var/log/monit.log
). Это поможет выявить, успешен ли был вызов скрипта и не возникли ли какие-либо ошибки во время его выполнения. -
Темп-файл:
Как вы упомянули, PagerDuty создает временный файл для триггера и, если он был изменен менее чем 4 часа назад, оповещение не отправляется. Вы можете попробовать удалить этот временный файл перед запуском Monit, чтобы протестировать, сработает ли вызов. -
Тестирование с уникальным событием:
Для тестирования вы можете изменить параметры передаваемые в ваш скрипт, например указать другое событие, чтобы проверить, создает ли оно оповещение. Это поможет исключить проблемы, связанные с кэшированием или временными файлами.
Заключение
Проблема, которую вы испытываете, может быть решена несколькими способами. Основные моменты включают в себя проверку корректности пути к скрипту, мониторинг логов Monit, а также выполнение очистки временных файлов, влияющих на отправку оповещений. Убедитесь, что все команды и параметры вписываются корректно и проверяются на наличие прав доступа. Так вы сможете настроить Monit для успешного выполнения вашего скрипта в случае остановки приложения.