supervisor
– система для управления сервисами, написана на Python, использует INI-конфиги для настроек.
Домашняя страница и документация – тут>>>, репозиторий – тут>>>.
Состоит из:
supervisord
: сам север, обрабатывающий запросы от клиентов и считывающий файлы настроек для сервисовsupervisorctl
: CLI для управдения процессами под контролемsupervisord
, подключаясь к нему через сокет или TCP порт- HTTP сервер: предоставляет веб-интерфейс для доступа к
supervisord
Содержание
Установка
В Debian/Ubuntu можно устанвить из репозитория:
[simterm]
$ sudo apt install supervisor
[/simterm]
Но в репозиториях может быть устаревшая версия (3.2.0 на момент написания), более новую можно получить из PyPi:
[simterm]
$ sudo apt install python-pip $ sudo pip install supervisor
[/simterm]
Версия:
[simterm]
ubuntu@ip-172-31-37-96:~$ supervisord –version
3.3.4
[/simterm]
Файл настроек
Что бы создать файл настроек – используем echo_supervisord_conf
.
Файл настроек, который supervisord
использует по умолчанию – /etc/supervisord.conf
, при желании можно указать другой, используя опцию -c
.
Создаём файл:
[simterm]
$ sudo sh -c 'echo_supervisord_conf > /etc/supervisord.conf'
[/simterm]
Запуск
Для тестов можно запускать supervisord
напрямую, и передавая ему опцию -n
, что бы оставался в foreground
:
[simterm]
ubuntu@ip-172-31-37-96:~$ /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
[/simterm]
Если выполнить его без -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
Переносим дефолтный файл настроек:
[simterm]
$ sudo mkdir /etc/supervisor/ $ sudo mv /etc/supervisord.conf /etc/supervisor/
[/simterm]
Запускаем:
[simterm]
$ sudo systemctl start supervisord.service
[/simterm]
И проверяем:
[simterm]
ubuntu@ip-172-31-37-96:~$ 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
[/simterm]
Добавление сервисов
Что бы добавить сервис, который будет обслуживаться supervisord
– создадим файл в каталоге /etc/supervisor/conf.d/
:
[simterm]
$ sudo mkdir /etc/supervisor/conf.d
[/simterm]
Редактируем /etc/supervisor/supervisord.conf
, обновляем [include]
в самом конце файла:
... [include] files=conf.d/*.conf files=conf.d/*.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
Устанавливаем бит выполнения:
[simterm]
# chmod +x /home/ubuntu/supr_expl.sh
[/simterm]
Добавляем новый конфиг для 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
: запускать программу при запуске самогоsupervisord
autorestart
: перезапускать программу, если она “вылетела”stderr_logfile
: вывод stderrstdout_logfile
: вывод stdout
Теперь можно использвать supervisorctl
для управления программой.
Перечитываем конфиги:
[simterm]
root@ip-172-31-37-96:~# supervisorctl reread
supr_expl: available
[/simterm]
Добавляем его в supervisord
:
[simterm]
root@ip-172-31-37-96:~# supervisorctl add supr_expl
supr_expl: added process group
[/simterm]
Проверяем статус:
[simterm]
root@ip-172-31-37-96:~# supervisorctl status
supr_expl RUNNING pid 13584, uptime 0:00:40
[/simterm]
Останавливаем:
[simterm]
root@ip-172-31-37-96:~# supervisorctl stop supr_expl
supr_expl: stopped
[/simterm]
Удаляем:
[simterm]
root@ip-172-31-37-96:~# supervisorctl remove supr_expl
supr_expl: removed process group
[/simterm]
Проверяем логи:
[simterm]
root@ip-172-31-37-96:~# 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
[/simterm]
И пример добавления NGINX, создаём файл:
[program:nginx] command=/usr/sbin/nginx -g "daemon off;" autostart=true autorestart=true stdout_events_enabled=true stderr_events_enabled=true
Перечитываем конфиги:
[simterm]
root@ip-172-31-37-96:~# supervisorctl reread nginx: available supr_expl: available
[/simterm]
Устанавливаем сам nginx
:
[simterm]
# apt install nginx
[/simterm]
Запускаем его:
[simterm]
root@ip-172-31-37-96:~# supervisorctl add nginx
nginx: added process group
[/simterm]
Проверяем:
[simterm]
root@ip-172-31-37-96:~# supervisorctl status nginx
nginx RUNNING pid 14647, uptime 0:00:02
[/simterm]
И curl
-ом:
[simterm]
root@ip-172-31-37-96:~# curl localhost -I
HTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Mon, 07 May 2018 08:58:22 GMT
[/simterm]
См. документацию тут>>>.
Веб-интерфейс
Кроме supervisorctl
– доступен веб-интерфейс через встроенный в supervisor
веб-сервер.
Редактируем /etc/supervisor/supervisord.conf
, убираем комментарии:
... [inet_http_server] ; inet (TCP) server disabled by default port=*:9001 ; ip_address:port specifier, *:port for all iface ;username=user ; default is no username (open server) ;password=123 ; default is no password (open server) ...
Перезапускаем supervisord
:
[simterm]
# systemctl restart supervisord.service
[/simterm]
Проверяем:
Готово.