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

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: запускать программу при запуске самого supervisord
  • autorestart: перезапускать программу, если она “вылетела”
  • stderr_logfile: вывод stderr
  • stdout_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

Report Page