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