supervisord берёт на себя то же, что обычно делает systemd — следит, что процесс жив, перезапускает его при падении, собирает stdout/stderr в лог — но делает это в userspace, без прав на системные unit-файлы и без зависимости от PID 1. Удобно для контейнеров без systemd, для приложений, которые разворачивает не root, или когда процессов много и плодить под каждый unit-файл избыточно.
Конфиг собирается из блоков [program:x], каждый описывает один управляемый процесс:
; /etc/supervisor/conf.d/myapp.conf
[program:myapp]
command=/usr/bin/python3 /opt/myapp/worker.py
directory=/opt/myapp
user=myapp
autostart=true
autorestart=unexpected
startretries=3
stdout_logfile=/var/log/myapp/stdout.log
stderr_logfile=/var/log/myapp/stderr.log
autorestart=unexpected перезапускает процесс только если он вышел с кодом, не входящим в exitcodes (по умолчанию это 0) — в отличие от autorestart=true, который перезапускает при любом завершении, включая штатный exit 0. startretries ограничивает число попыток запуска подряд, если процесс падает сразу после старта, а не уходит в бесконечный crash loop.
Управление — через supervisorctl, без ручной правки запущенных процессов:
supervisorctl status
supervisorctl restart myapp
supervisorctl reread # показать, что изменилось в conf.d
supervisorctl update # применить изменения: остановить удалённые, запустить новые
reread только показывает разницу, реальные действия выполняет update — такое разделение защищает от случайного рестарта всего парка процессов при правке одного конфига.
#linux #sysadmin
