Supervisor: Полный гайд по настройке менеджера процессов в Linux
Ваши приложения падают в самый неподходящий момент, а вы об этом узнаете последним? Представьте инструмент, который будет следить за ними 24/7 и автоматически поднимать после сбоя. Это не systemd со сложной конфигурацией, а что-то гораздо более элегантное и простое.
Supervisor — ваш личный надзиратель для процессов. Эта легковесная программа на Python возьмет на себя рутину: запустит нужное количество копий вашего скрипта, перезапустит их при падении и аккуратно запишет все логи.
Особенно он незаменим в Docker-контейнерах, где по умолчанию может работать только один процесс. Запустите Supervisor — и он станет вашим оркестром, управляющим всем внутри.
Вы научитесь устанавливать его на Ubuntu 20.04 из официальных репозиториев одной командой. Поймете, как создавать конфигурационные файлы для ваших программ в директории /etc/supervisor/conf.d/. Мы разберем ключевые параметры: от простых command и user до запуска нескольких копий процесса с помощью numprocs.
Вы сможете настроить перенаправление логов в файлы или прямо в консоль, передавать переменные окружения и гибко управлять процессами через утилиту supervisorctl. Остановить, перезапустить или даже подключиться к выводу конкретного экземпляра — всё это станет вашими повседневными инструментами.
Хватит гадать, работают ли ваши фоновые задачи. Перестаньте вручную их перезапускать. Готовы превратить управление процессами из головной боли в автоматизированную рутину? Тогда читайте наше подробное руководство и настройте своего супервизора за 10 минут!
Для управления процессами в Linux существуют системы инициализации, такие как systemd. Однако что, если надо что-то более простое? Например, программа, которая сможет управлять процессами вашего приложения, в системе или в Docker контейнере. Такая программа существует. Она называется supervisor.
Это простой менеджер процессов с открытым исходным кодом, написанный на Python, с помощью которого можно запускать нужное количество копий процесса и следить за их состоянием. В этой статье мы рассмотрим как выполняется установка и настройка Supervisor на примере Ubuntu 20.04.
Содержание статьи
Установка Supervisor в Ubuntu 20.04
Самый простой способ получить программу - установить её из официальных репозиториев. Для этого надо выполнить команду:
sudo apt install supervisor

Если вы хотите чтобы программа работала постоянно, её надо добавить в автозагрузку и запустить. Для этого выполните:
sudo systemctl enable supervisor --now

Затем можно посмотреть состояние с помощью команды:
sudo systemctl status supervisor

Настройка supervisor
Конфигурационный файл программы находится по адресу /etc/supervisor/supervisord.conf. Здесь находятся основные настройки. Для настроек запускаемых процессов лучше использовать директорию /etc/supervisor/conf.d/. Основной конфигурационный файл можно оставить по умолчанию. Давайте рассмотрим как создавать конфигурационные файлы для программ. Синтаксис секции для одного процесса выглядит вот так:
**[program:имя_программы]**имя_переменной=значение
Для каждого процесса минимально надо передать такие переменные для того чтобы он автоматически запускался и восстанавливался после падения:
- directory - рабочая директория;
- command - команда запуска процесса;
- user - пользователь, от имени которого будет запущен процесс;
- autostart - нужно ли автоматически запускать процесс;
- autorestart - нужно ли перезапускать процесс;
Однако доступных настроек намного больше, вот некоторые из тех, которые будут рассмотрены в данной статье:
- priority - приоритет запускаемого процесса;
- environment - переменные окружения, которые надо передать процессу;
- stdout_logfile - куда перенаправлять вывод stdout процесса;
- stderr_logfile - куда перенаправлять вывод stderr процесса;
- process_name - название процесса, с возможностью подстановки номера копии;
- numprocs - количество запускаемых копий процесса;
- startretries - количество попыток запустить программу;
- redirect_stderr - перенаправить вывод ошибок процесса в вывод supervisor;
- redirect_stdout - перенаправить вывод процесса в вывод supervisor.
Для примера можно реализовать скрипт на PHP, который будет просто висеть в фоне:
sudo vi /home/sergiy/program/process.php
<?php
echo "Started...";
while(true){
sleep(5);
}
Теперь для этого процесса можно создать конфигурационный файл supervisor. Вы можете вставлять конфигурацию прямо в конец основного конфигурационного файла, но так лучше не делать. Лучше для каждой программы создавать отдельный конфигурационный файл в каталоге /etc/supervisor/conf.d/ с именем *.conf. Например, для этой программы этот файл будет выглядеть вот так:
sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
Затем надо перезапустить supervisor, это можно сделать с помощью systemctl:
sudo systemctl restart supervisor
Или с помощью утилиты supervisorctl:
sudo supervisorctl reload

Затем вы можете посмотреть состояние настроенных процессов с помощью команды:

Если процесс находится в состоянии RUNNING, значит всё хорошо и он был запущен успешно. Однако сейчас процесс запущен в одном экземпляре, а довольно часто надо запустить несколько копий одного и того же процесса. Для этого можно воспользоваться параметрами process_name и numprocs. Первый позволяет модифицировать имя процесса, так чтобы оно содержало номер копии, а второй указывает сколько копий надо запустить.
В переменную process_name обычно прописывается шаблон форматирования строки python, который содержит название программы и номер процесса: %(program_name)s_%(process_num)02d. Здесь с скобках находится имя переменной, а за ними её тип. Например, для запуска той же программы в четыре потока конфигурационный файл надо привести к такому виду:
sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d
numprocs=4
Теперь надо снова перезагрузить supervisorctl и уже будет запущено 4 процесса:
sudo supervisorctl status

Кроме того можно сохранять всё, что выводит программа в лог файл. Для этого используются параметры stdout_logfile и stderr_logfile. Например, можно прямо в папке с программой, выводить лог файл её выполнения.
sudo vi /etc/supervisor/conf.d/process.conf
[program:process]
directory=/home/sergiy/program/
command=/usr/bin/php process.php
user=sergiy
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d
numprocs=4
stdout_logfile=/home/sergiy/program/process.log
stderr_logfile=/home/sergiy/program/process.log.error
После перезагрузки сервиса в папке с программой появятся логи:

Аналогично, если вы хотите перенаправить вывод ваших процессов в стандартный вывод supervisor, следует использовать параметры redirect_stderr и redirect_stdout. Если вашей программе нужны какие-либо переменные окружения, вы можете их передать с помощью параметра environment. Переменные надо записать через запятую. Например:
environment=DISPLAY=":1",HOME="/root"
После каждого изменения конфигурации не забывайте перезапускать supervisor, для того чтобы применить изменения. С помощью утилиты supervisorctl можно управлять процессами. Как вы уже поняли, для того чтобы посмотреть список процессов надо выполнить:
sudo supervisorctl status
Далее, зная имя процесса, его можно перезапустить, например process:process_00:
sudo supervisorctl restart process:process_00

Остановить:
sudo supervisorctl stop process:process_00
Или запустить:
sudo supervisorctl start process:process_00
Кроме того, можно подключится к процессу и посмотреть что он выводит в stdout/stderr с помощью команды fg:
sudo supervisorctl fg process:process_00
Выводы
В этой статье мы рассмотрели как выполняется настройка supervisor, а также как пользоваться программой для управления процессами. Как видите программа довольно удобна и проста в использовании. Особенно её удобно применять в Docker, из-за ограничения на один запущенный процесс в контейнере. Вы можете запустить только supervisor, а все остальные процессы настроить в нём.