Перейти к содержанию

Менеджер процессов 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

/etc/systemd/system/supervisor.service

[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 reload
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 - утилита для запуска сервера

Предпологаем, что Supervisor установлен в ОС. Далее сделаем отдельную папку для логов

sudo mkdir /var/log/hlds
sudo chown -R steam
И собственно сам процесс настройки.

Создаем файл /etc/supervisor/conf.d/hlds.conf и вставляем туда следующее содержимое

Внимание: путь к серверу, пользователя и параметры запуска измените на свои. Здесь они приведены для примера

[program:Название]
user=steam
environment = HOME="/steam",LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH"
process_name=hlds
directory=/srv/hlds/
command=/srv/hlds/hlds_linux -game cstrike -norestart +servercfgfile server.cfg +sv_lan 0 +ip 127.0.0.1 +port 27015 +maxplayers 32 +map de_dust2
numprocs=1
startretries=3
autostart=true
autorestart=true
stdout_logfile=/var/log/hlds/hlds.log
stdout_logfile_maxbytes=5MB
stdout_logfile_backups=10
redirect_stderr=true
stderr_logfile=/var/log/hlds/error.log
stderr_logfile_maxbytes=5MB
stderr_logfile_backups=10

Описание настройки

  • [program:hlds] - Название программы. Служит для управления.
  • user - Пользователь от которого запускать сервер
  • environment - /steam путь к home директории пользователя от которого запускаем процесс. Все остальное оставляем как есть
  • process_name - имя процесса
  • directory - путь к директории сервера
  • command - команда запуска. Обратите внимания на hlds_linux вместо hlds_run
  • numprocs - количество процессов. В нашем случае 1
  • startretries - количество попыток автоподнятия при падении. При превышении сервер больше не поднимется
  • autostart - автозапуск при запуске ОС
  • autorestart - автоперезапуск при падении
  • stdout_logfile - путь к логфайлу
  • stdout_logfile_maxbytes - максимальный размер лог файла
  • stdout_logfile_backups - максимальное количество лог файлов
  • redirect_stderr - переадресация потока ошибок
  • stderr_logfile - путь к логу ошибок
  • stderr_logfile_maxbytes - максимальный размер файла ошибок
  • stderr_logfile_backups - максимальное количество файлов ошибок

После этого рестартим сервис

sudo service supervisor restart

Для контроля есть утилита supervisorctl, которая идет вместе с самим supervisor

Запуск

supervisorctl start hlds
Остановка
supervisorctl stop hlds
Перезапуск
supervisorctl restart hlds

Больше информации о настройках здесь