Linux: supervisor – управление процессами и сервисами
supervisor – система для управления сервисами, написана на Python, использует INI-конфиги для настроек.Домашняя страница и документация – тут>>>, репозиторий – тут>>>.
Состоит из:
supervisord: сам север, обрабатывающий запросы от клиентов и считывающий файлы настроек для сервисовsupervisorctl: CLI для управдения процессами под контролемsupervisord, подключаясь к нему через сокет или TCP порт- HTTP сервер: предоставляет веб-интерфейс для доступа к
supervisord
Установка
В Debian/Ubuntu можно устанвить из репозитория:
$ sudo apt install supervisor
Но в репозиториях может быть устаревшая версия (3.2.0 на момент написания), более новую можно получить из PyPi:
$ sudo apt install python-pip
$ sudo pip install supervisor
Версия:
$ supervisord --version
Файл настроек
Что бы создать файл настроек – используем echo_supervisord_conf.
Файл настроек, который supervisord использует по умолчанию – /etc/supervisord.conf, при желании можно указать другой, используя опцию -c.
Создаём файл:
$ sudo sh -c 'echo_supervisord_conf > /etc/supervisord.conf'
Запуск
Для тестов можно запускать supervisord напрямую, и передавая ему опцию -n, что бы оставался в foreground:
$ /usr/local/bin/supervisord -n
2018-05-04 14:23:55,083 INFO RPC interface ‘supervisor’ initialized
2018-05-04 14:23:55,084 CRIT Server ‘unix_http_server’ running without any HTTP authentication checking
2018-05-04 14:23:55,084 INFO supervisord started with pid 8875
Если выполнить его без -n – сервис запустится сразу в фоне, и будет писать данные в лог /var/log/supervisor/supervisord.log.
Для запуска вместе с системой, используя systemd – на Ubuntu 16.04 надо написать свой сервис-файл.
Создаём файл /etc/systemd/system/supervisord.service:
[Unit] Description=Supervisor daemon 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 $OPTIONS reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target Alias=supervisord.service
Переносим дефолтный файл настроек:
$ sudo mkdir /etc/supervisor/
$ sudo mv /etc/supervisord.conf /etc/supervisor/
Запускаем:
$ sudo systemctl start supervisord.service
И проверяем:
$ ps aux | grep super
root 9069 0.1 3.7 57596 18804 ? Ss 14:36 0:00 /usr/bin/python /usr/local/bin/supervisord -n -c /etc/supervisord.conf
Добавление сервисов
Что бы добавить сервис, который будет обслуживаться supervisord – создадим файл в каталоге /etc/supervisor/conf.d/:
$ sudo mkdir /etc/supervisor/conf.d
Редактируем /etc/supervisor/supervisord.conf, обновляем [include] в самом конце файла:
... [include] files=conf.d/*.conf files=conf.d/*.ini ;files = relative/directory/*.ini
;files = relative/directory/*.ini
Каждый сервис, который будет управляться supervisord, добавляется через отдельный блок [program].
Для примера – создадим скрипт, который пишет в stdout и stderr:
#!/usr/bin/env bash
while true; do
# out to stdout
echo "stdout at $(date)"
# out to stderr
echo "stderr at $(date)" > &2
sleep 1
done
Устанавливаем бит выполнения:
$ chmod +x /home/ubuntu/supr_expl.sh
Добавляем новый конфиг для supervisor – /etc/supervisor/conf.d/supr_expl.conf:
[program:supr_expl] command=/home/ubuntu/supr_expl.sh autostart=true autorestart=true stderr_logfile=/var/log/supr_expl.err.log stdout_logfile=/var/log/supr_expl.out.log
Тут:
command: путь к исполняемому файлу программыautostart: запускать программу при запуске самогоsupervisordautorestart: перезапускать программу, если она “вылетела”stderr_logfile: вывод stderrstdout_logfile: вывод stdout
Теперь можно использвать supervisorctl для управления программой.
Перечитываем конфиги:
# supervisorctl reread
supr_expl: available
Добавляем его в supervisord:
# supervisorctl add supr_expl
supr_expl: added process group
Проверяем статус:
# supervisorctl status
supr_expl RUNNING pid 13584, uptime 0:00:40
Останавливаем:
# supervisorctl stop supr_expl
supr_expl: stopped
Удаляем:
# supervisorctl remove supr_expl
supr_expl: removed process group
Проверяем логи:
# head -n 3 /var/log/supr_expl.*
==> /var/log/supr_expl.err.log <==
stderr at Mon May 7 08:49:29 UTC 2018
stderr at Mon May 7 08:49:30 UTC 2018
stderr at Mon May 7 08:49:31 UTC 2018
==> /var/log/supr_expl.out.log <==
stdout at Mon May 7 08:49:29 UTC 2018
stdout at Mon May 7 08:49:30 UTC 2018
stdout at Mon May 7 08:49:31 UTC 2018
И пример добавления NGINX, создаём файл:
[program:nginx] command=/usr/sbin/nginx -g "daemon off;" autostart=true autorestart=true stdout_events_enabled=true stderr_events_enabled=true
Перечитываем конфиги:
# supervisorctl reread
nginx: available
supr_expl: available
Устанавливаем сам Nginx:
# apt install nginx
Запускаем:
# supervisorctl add nginx
nginx: added process group