
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: запускать программу при запуске самогоsupervisordautorestart: перезапускать программу, если она «вылетела»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]
Проверяем:
Готово.





