Настройка supervisord


supervisord — демон и служба, позволяющая обеспечивать непрерывную работу критичных сервисов. Это самый простой способ следить за процессами и перезапускать их при необходимости.



На любом сервере есть процессы которые должны выполняться постоянно. Например, для веб-сервера это может быть PHP-FPM или любой другой бэкенд (ниже рассмотрим Angular-CLI в development режиме).



Если происходит ситуация, вызванная кратковременными причинами, при которой процесс завершается посетитель сайта увидит серверную ошибку 502. Причиной может быть нехватка памяти и OOM.

И хотя после OOM сервер вновь работоспособен ошибка не исчезнет поскольку процесс завершился. Администратору придется запускать его вручную.



Чтобы этого избежать пишут скрипты для запуска сервисов для systemd или upstart. Или же используют runit. Службы перезапускать может система мониторинга monit.


Самый простой способ — supervisor (официальный сайт проекта).



Установка и настройка supervisord


Пакет устанавливается из репозитория

apt install supervisor



supervisor работает так же как аналоги вроде runit, но удобнее него при конфигурации. Достаточно создать файл с настройками и прописать в нем несколько директив.



Основной конфигурационный файл пакета обычно менять не требуется

less /etc/supervisor/supervisord.conf

В нем подключаются все файлы директории conf.d с расширением .conf



Поэтому если нужно добавить новый сервис создается такой файл

mcedit /etc/supervisor/conf.d/angular.conf

[program:ang]
command=ng serve
directory=/home/angular/
stdout_logfile=/var/log/ang.log
autostart=true
autorestart=true
startretries=6
user=root
stopsignal=KILL


Простейшая конфигурация представляет собой имя приложения, команду которой, оно запускается. Каталог, в котором должна быть выполнена команда. Также логирование, сигнал по которому производится завершение работы и пользователь — владелец процесса.



Директивы autostart=true и autorestart=true обеспечат перезапуск в случае если сервер по какой-то причине перестал работать. Возможности очень широкие, можно настроить отправку уведомлений на почту (так же может Monit).

После добавления конфигурационного файла supervisor перезапускается. Дальнейшее управление возможно при помощи supervisorctl



supervisorctl

ang RUNNING pid 624, uptime 2 days, 2:26:29

Приглашение к вводу команды изменилось, из такого режима можно выполнять те же действия, но без указания supervisorctl . Например, посмотреть справку:

supervisor> help


Установка supervisord выполнена.



Самые популярные команды при управлении supervisord


На иллюстрации представлен синтаксис любой команды по управлению службой при помощи supervisor

supervisord

supervisorctl stop ang


Остановит один сервис

supervisorctl start all


Запустит все

supervisorctl restart all


Перезапустит все сервисы, о которых знает supervisor

supervisorctl reread


Перечитывает все конфигурационные файлы, сервисы не перезапускает

supervisorctl update


Используется в паре с предыдущей командой — перезапускает все сервисы, в конфигурационных файлах которых произошли изменения



В случае возникновения ошибок информацию о причинах следует искать в логах supervisor

less /var/log/supervisor/supervisord.log


Или каждого из сервисов (идентификатор генерируется заново при рестарте)

less /var/log/supervisor/ang-stderr—supervisor-Zkoh5I.log



Рассмотренное решение часто применяется для запуска приложений на Ruby, Python и NodeJS. На одном сервере может быть неограниченное количество управляемых сервисов, которым можно отдавать команды по одному или всем вместе.

Monit является другим способом автоматически перезапускать сервисы, которые по каким-то причинам перестали работать.

Сказать спасибо