supervisord

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

 

Настройка supervisord на Debian сервере

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

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

 

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

 

 

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

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

 

Пакет устанавливается из репозитория при помощи apt-get install 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

 

 

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

На иллюстрации представлен синтаксис любой команды по управлению службой при помощи 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 является другим способом автоматически перезапускать сервисы, которые по каким-то причинам перестали работать.