Linux: supervisor – управление процессами и сервисами

Автор: | 07/05/2018

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: вывод stderr
  • stdout_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]

Проверяем:

Готово.