Коротко: 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).