supervisord под systemd: два надзорщика за одними процессами
Два надзорщика за одними процессами дают неопределённое поведение: остановка через один из них означает перезапуск другим, а состояние службы в systemd не отражает реальность. Схема встречается при переносе старых установок и почти всегда лишняя.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
systemd видит только надзорщика, а не приложения
Для systemd работает один процесс. Падение отдельного приложения внутри для него невидимо, и служба остаётся в рабочем состоянии при нерабочем приложении.
-
Остановка не срабатывает: процессы поднимаются заново
Остановленное одним надзорщиком приложение поднимает второй. Снаружи это выглядит как невозможность остановить службу.
-
Журналы приложений не попадают в журнал системы
Надзорщик пишет вывод приложений в свои файлы. Разбор идёт мимо журнала, и привязки к unit нет.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Состояние приложений внутри надзорщика.
sudo supervisorctl statusДерево процессов службы: видно всё, что запущено внутри.
systemd-cgls -u supervisor.serviceКак systemd обращается со своим надзорщиком.
systemctl show supervisor -p Restart -p KillModeРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Для systemd работает один процесс. Падение отдельного приложения внутри для него невидимо, и служба остаётся в рабочем состоянии при нерабочем приложении.
- Как проверить
-
Сравните состояние службы и приложений внутри.
systemctl status supervisor --no-pager | head -6 sudo supervisorctl status 2>/dev/null
- Как исправить
- Перенесите приложения в отдельные unit-файлы systemd. Тогда состояние, журнал и перезапуск каждого будут видны штатными средствами.
- Почему происходит
- Остановленное одним надзорщиком приложение поднимает второй. Снаружи это выглядит как невозможность остановить службу.
- Как проверить
-
Посмотрите, кто родитель процессов приложения.
ps -eo pid,ppid,cmd | grep -v grep | grep myapp | head systemd-cgls -u supervisor.service 2>/dev/null | head
- Как исправить
- Оставьте одного надзорщика. Если надзорщик приложений нужен, systemd не должен перезапускать его процессы, и наоборот.
- Почему происходит
- Надзорщик пишет вывод приложений в свои файлы. Разбор идёт мимо журнала, и привязки к unit нет.
- Как проверить
-
Посмотрите, куда идут журналы приложений.
sudo grep -hE "^logfile|stdout_logfile" /etc/supervisor/supervisord.conf /etc/supervisor/conf.d/* 2>/dev/null | head
- Как исправить
- При переносе в systemd вывод пойдёт в журнал с привязкой к unit. Это единственный способ искать по всем службам сразу.
Пример вывода
Служба работает, приложение внутри — нет. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemctl status supervisor --no-pager | head -3
● supervisor.service - Supervisor process control system
Active: active (running) since Mon 2026-09-15 09:14:02 MSK; 7h ago
$ sudo supervisorctl status
myapp FATAL Exited too quickly (process log may have details)
Связанные ошибки
- Одноразовая задача: как не получить ложный сбой Правильная настройка Type=oneshot: RemainAfterExit, коды возврата, зависимости и вызов по таймеру.
- status=0/SUCCESS, но служба считается упавшей Программа завершилась успешно, а systemctl показывает inactive или failed. Разбор: Type=simple против forking, RemainAfterExit, демонизация.
- Процессы вне служб: области и потерянные процессы Процессы работают вне unit: запущены из терминала или сеанса. Почему systemd их не перезапускает и как перевести.
- No such process при остановке или сигнале Ошибка 3: процесса с таким номером нет. Разбор для команд остановки и подстановки номера процесса.
- Too many tasks: упор в предел TasksMax Служба не может создать новый процесс: достигнут предел TasksMax. Где он задан и как поднять правильно.
- Служба не занимает имя на шине: оно уже занято Запуск проходит, а обращения идут не туда: второй экземпляр или оставшийся процесс держит имя на шине.
- Служба не создаёт потоки: упор в предел Ошибка создания потока: исчерпан TasksMax или системный предел процессов. Как посчитать нужное значение.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
Источники
- Документация Supervisor
-
systemd.service(5)
Отслеживание процессов службы и режимы остановки. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено надзорщиком под systemd с падающим приложением внутри.