Менеджер процессов 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
Больше информации о настройках здесь