Коротко: Supervisor держит скрипты-демоны запущенными и переподнимает после падения; разбираем установку, конфиг и пример с очередью.
Supervisor (supervisord) — простой менеджер процессов для Linux: он держит ваши скрипты-демоны запущенными постоянно и автоматически переподнимает их после падения. Это решает проблему «бесхозного» фонового процесса, за которым некому следить. Разберём установку, синтаксис конфигурации и рабочий пример с очередью.
Помимо разовых запусков и запуска по расписанию, часто нужно, чтобы скрипт работал непрерывно — такие скрипты называют демонами. Если просто запустить демон в консоли (даже отвязав от неё процесс), он окажется бесхозным: упадёт — и придётся идти на сервер и поднимать руками. Supervisor автоматизирует это, имеет простой синтаксис и поддерживается в большинстве дистрибутивов.
Как установить Supervisor?
sudo apt install supervisor
Чтобы он работал постоянно и стартовал вместе с системой:
sudo systemctl enable supervisor --now
Проверить состояние:
sudo systemctl status supervisor
Как настроить процессы?
У Supervisor есть основной конфиг и директория для отдельных файлов конфигурации — чтобы не держать всё в одном месте. Основной файл: /etc/supervisor/supervisord.conf. Директория: /etc/supervisor/conf.d/ — здесь можно создать, например, rabbit_mq.conf.
Минимальный набор параметров, чтобы процесс автоматически запускался и восстанавливался после падения:
- directory — рабочая директория;
- command — команда запуска процесса;
- user — пользователь, от имени которого запускается процесс;
- autostart — запускать ли процесс автоматически;
- autorestart — перезапускать ли процесс после падения.
Настроек гораздо больше, вот часто используемые:
- priority — приоритет запускаемого процесса;
- environment — переменные окружения для процесса;
- stdout_logfile — куда перенаправлять stdout;
- stderr_logfile — куда перенаправлять stderr;
- process_name — имя процесса с подстановкой номера копии;
- numprocs — количество запускаемых копий;
- startretries — число попыток запуска;
- redirect_stderr — перенаправить ошибки процесса в вывод supervisor;
- startsecs — через сколько секунд после падения перезапускать процесс.
Рассмотрим пример запуска демона-консьюмера RabbitMQ для Symfony:
[program:smsnotificationprocessor]
command=/*/*/*/bin/console rabbitmq:consumer sms_notification_processor
numprocs=3
process_name=%(program_name)s_%(process_num)02d
user=test_portal_user
autostart=true
autorestart=true
startsecs=0
Эта конфигурация запускает команду bin/console rabbitmq:consumer (пути указываются от корня сервера) в трёх экземплярах, от пользователя test_portal_user (укажите того, под кем у вас настроена работа с RabbitMQ). Флаги autostart и autorestart в true означают, что при падении supervisor сам переподнимет процесс.
После добавления или изменения конфигурации перезапустите supervisor одной из команд:
sudo systemctl restart supervisor
sudo supervisorctl reload
И проверьте статус процессов, запущенных под supervisor:
sudo supervisorctl status
Как видите, поставить скрипт под supervisor совсем не сложно. Если нужно выстроить надёжную фоновую обработку (очереди, демоны, воркеры) на проде — помогу на консультации.
Помимо перезапуска процессов полезно видеть их ошибки в одном месте — воркеры удобно слать в Gotcha (совместим с Sentry SDK и OTLP).