Менеджер процессов Supervisor

Supervisor это удобный инструмент позволяющий пользователям контролировать процессы. К примеру если нужно запустить некий скрипт на постоянное исполнение, и при этом нужно иметь более удобный интерфейс для управления, чем это может дать screen.

Конечно всегда можно написать init скрипт, добавить сервис в systemd, но это требует хорошего знания и опыта настройки системы инициализации процессов.

Supervisor предоставляет удобный интерфейс для этого.

Установка supervisor

Установка из пакета

Установка простая:

sudo apt install supervisor

Далее можно убедиться что установка успешна и сервис supervisor работает:

sudo systemctl restart supervisor
sudo systemctl status supervisor

Установка из pip3

В официальной документации этот тип установки рассматривается как приоритетный, поэтому рассмотрю и его. Этот способ сложнее и требует понимания того как работает systemd. Предполагается что у нас в системе уже установлен python3 и python3-pip.

Установка pip пакета

sudo pip3 install supervisor

если выполнить эту комманду от пользователя, то supervisor установится в окружение пользователя. Не наш вариант. Поэтому делаем от root’а

Создадим конфигурацию сервиса для systemd

[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target
     
[Service]
ExecStart=/usr/local/bin/supervisord -n -c /etc/supervisor/supervisord.conf
ExecStop=/usr/local/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/local/bin/supervisorctl -c /etc/supervisor/supervisord.conf $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=50s
 
[Install]
WantedBy=multi-user.target

Создадим конфигурационный файл

sudo mkdir -p /etc/supervisor/conf.d
sudo vi /etc/supervisor/supervisord.conf

Содержание конфига примерно такое:

/etc/supervisor/supervisord.conf

; supervisor config file
 
[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file)
chmod=0700                       ; sockef file mode (default 0700)
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)
     
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
 
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket
 
[include]
files = /etc/supervisor/conf.d/*.conf

Включим сервис

sudo systemctl enable supervisor
sudo systemctl restart supervisor
sudo systemctl status supervisor

Добавление процесса в supervisor

К примеру у нас есть такой скрипт:

/usr/local/bin/myscript

#!/usr/bin/env bash
while true
do
    # Echo current date to stdout
    echo `date`
    # Echo 'error!' to stderr
    echo 'error!' >&2
    sleep 5
done

Каждые 5 секунд он выводит на стандартный вывод текущую дату, а на вывод ошибок (stderr) некоторое сообщение. Создадим для него конфигурацию:

/etc/supervisor/conf.d/myscript.conf

[program:myscript]
command=/usr/local/bin/myscript
autostart=true
autorestart=true
stopasgroup=true
stderr_logfile=/var/log/supervisor/myscript-err.log
stdout_logfile=/var/log/supervisor/myscript-out.log

Скомандуем supervisor перечитать конфиг и добавить наш сервис:

sudo supervisorctl reread
sudo supervisorctl update

Это все.

Управление процессами

Старт и остановка:

sudo supervisorctl start myscript
sudo supervisorctl stop myscript

Добавить и удалить процесс:

sudo supervisorctl add myscript
sudo supervisorctl remove myscript

Просмотр состояния:

sudo supervisorctl status myscript

Просмотр логов:

sudo supervisorctl tail myscript
sudo supervisorctl tail myscript stderr

Конечно же логи можно просмотреть и стандартными средствами системы.

Заключение

Supervisor прекрасно документирован. Очень гибко конфигурируется. Я рассмотрел всего лишь верхушку айсберга.