Supervisor - это клиент-серверная система, используемая для управления рядом процессов UNIX, в частности, процессами, связанными с проектом или клиентом. Например, вы можете использовать supervisor для порождения и отслеживания произвольного числа рабочих очередей вашего веб-приложения.
Компоненты этой системы:
- supervisord: серверная часть системы.
- supervisorctl: интерфейс командной строки, используемый для взаимодействия с сервером.
- Веб-сервер: простой веб-сервер и веб-интерфейс пользователя с основными функциями по сравнению с supervisorctl .
- Интерфейс XML-RPC: тот же HTTP-сервер, используемый веб-клиентом, служит интерфейсом XML-RPC, который можно использовать для управления программами супервизора.
В этом уроке мы установим самую последнюю версию супервизора, покажем, как создавать программы и упр��влять ими supervisorctl
, а также настроим веб-интерфейс для управления нашими программами.
Установка и базовая настройка
Мы будем устанавливать супервизор через easy_install
, особенность python setuptools.
Сначала обновите список локальных пакетов, а затем установите python setuptools
.
sudo apt-get update && sudo apt-get install python-setuptools
Теперь мы можем установить супервизор.
sudo easy_install supervisor
После завершения установки мы должны сгенерировать наш файл конфигурации. Создайте папку с именем supervisor
внутри /etc
.
sudo mkdir /etc/supervisor
И затем выполните следующее.
echo_supervisord_conf > /etc/supervisor/supervisord.conf
Если вы не вошли в систему с root
пользователем, вы можете получить Permission denied
ошибку (даже с sudo
). Это связано с перенаправлением. Чтобы преодолеть это, войдите как root.
sudo su
Затем вы можете снова запустить команду.
echo_supervisord_conf > /etc/supervisor/supervisord.conf
Теперь вы можете оставить root
пользователя с помощью exit
команды. Команда echo_supervisord_conf
была предоставлена нашим супервизором установки.
Базовая конфигурация
Откройте /etc/supervisor/supervisord.conf
файл и проверьте его содержимое. Вы заметите, что этот файл конфигурации соответствует INI
синтаксису и разделен на разделы (представлены в скобках, как в [section-name]
).
Чтобы добавить программы для управления супервизором, нам просто нужно создать соответствующие [program]
разделы. Однако во избежание путаницы с основным файлом конфигурации каждый раз, когда нам нужно добавить (или изменить) программу, мы будем использовать этот [include]
раздел. Найдите этот раздел, раскомментируйте его и отредактируйте, чтобы он выглядел следующим образом.
[include]
files=conf.d/*.conf
Теперь для каждой программы, которую мы хотим добавить, мы будем создавать .ini
файл внутри /etc/supervisor/conf.d/
каталога. Давайте создадим эту папку.
sudo mkdir /etc/supervisor/conf.d
Запуск сервера супервизора
Как отмечалось ранее, супервизор состоит из сервера и клиентов, которые к нему подключаются. Чтобы иметь возможность управлять и контролировать программы, нам нужно запустить сервер. Для этого мы будем регистрировать сервер супервизора systemd
, чтобы он мог быть запущен при запуске системы.
Для этого создайте файл с именем supervisord.service
в /etc/systemd/system
каталоге.
sudo touch /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 systemctl start supervisord.service
Если служебный файл находится в /etc/systemd/system
каталоге, он будет автоматически запускаться при запуске системы.
Вы можете проверить статус услуги.
systemctl status supervisord.service
Кроме того, вы можете проверить журналы.
sudo journalctl -u supervisord.service
Добавление программ
Программы, контролируемые супервизором, задаются в разных [program]
разделах конфигурации. Для каждой программы, которой мы хотим управлять, мы создадим отдельный файл конфигурации, сообщающий путь к исполняемому файлу команды, любые переменные окружения, как выполнять в случае завершения работы.
Во-первых, давайте создадим простой скрипт, который регистрирует метку времени. Создайте файл с именем hello_supervisor.sh
(где бы вы ни пожелали, мы будем ссылаться на полный путь этого скрипта).
touch hello_supervisor.sh
Теперь поместите в него следующее содержимое
#!/bin/bash
while true
do
# Echo current timestamp to stdout
echo Hello Supervisor: `date`
# Echo 'error!' to stderr
echo An error ocurred at `date`! >&2
sleep 1
done
Теперь сделайте это исполняемым
chmod +x hello_supervisor.sh
В практическом плане этот сценарий практически бесполезен. Тем не менее, мы можем использовать его, чтобы продемонстрировать силу супервизора. Создайте соответствующий файл конфигурации, выполнив следующее.
sudo touch /etc/supervisor/conf.d/hello_supervisor.conf
Теперь поместите следующее содержимое в этот файл.
[program:hello_supervisor]
command=/home/USER/hello_supervisor.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/hello_supervisor.err.log
stdout_logfile=/var/log/hello_supervisor.out.log
Примечание. Обязательно замените его USER
своим именем пользователя.
Мы рассмотрим эту конфигурацию шаг за шагом.
[program:hello_supervisor]
command=/home/USER/hello_supervisor.sh
Сначала конфигурация начинается с определения программы с именем hello_supervisor . Он также сообщает полный путь исполняемого файла для запуска.
autostart=true
В этой строке указывается, что эта программа должна запускаться автоматически при запуске супервизора.
autorestart=true
Если программа по какой-либо причине завершает работу, эта строка информирует супервизора об автоматическом перезапуске процесса.
stderr_logfile=/var/log/hello_supervisor.err.log
stdout_logfile=/var/log/hello_supervisor.out.log
Эти строки определяют местоположение файла журнала для stderr
и stdout
, соответственно.
Управление программами
Теперь, когда мы установили и настроили супервизор, мы можем управлять нашими процессами.
После добавления новой программы мы должны выполнить следующие две команды, чтобы сообщить серверу о необходимости перечитать файлы конфигурации и применить любые изменения.
sudo supervisorctl reread
sudo supervisorctl update
Теперь выполните supervisorctl
клиент.
sudo supervisorctl
Вас встретит список зарегистрированных процессов. Вы увидите процесс, вызванный hello_supervisor
со RUNNING
статусом.
hello_supervisor RUNNING pid 6853, uptime 0:22:30
supervisor>
Введите help
список доступных команд.
supervisor> help
default commands (type help <topic>):
=====================================
add exit open reload restart start tail
avail fg pid remove shutdown status update
clear maintail quit reread signal stop version
В двух словах, мы можем start
, stop
и restart
программы, передавая его имя программы в качестве аргумента соответствующей команды.
supervisor> stop hello_supervisor
hello_supervisor: stopped
supervisor> start hello_supervisor
hello_supervisor: started
supervisor> restart hello_supervisor
hello_supervisor: stopped
hello_supervisor: started
supervisor>
Мы также можем посмотреть на вывод программы с помощью tail
команды.
supervisor> tail hello_supervisor
Hello Supervisor: Mon Sep 25 19:27:29 UTC 2017
Hello Supervisor: Mon Sep 25 19:27:30 UTC 2017
Hello Supervisor: Mon Sep 25 19:27:31 UTC 2017
Для stderr
вывода вы также можете использовать tail
.
supervisor> tail hello_supervisor stderr
An error ocurred at Mon Sep 25 19:31:12 UTC 2017!
An error ocurred at Mon Sep 25 19:31:13 UTC 2017!
An error ocurred at Mon Sep 25 19:31:14 UTC 2017!
Вызвав status
команду, вы можете просмотреть статус всех зарегистрированных программ.
Как только вы закончите, вы можете выйти.
supervisor> quit
Клиент веб-сервера
Чтобы разрешить доступ к веб-серверу супервизора, откройте файл конфигурации супервизора и найдите [inet_http_server]
раздел.
nano /etc/supervisor/supervisord.conf
Теперь обновите конфигурацию этого раздела следующим образом.
[inet_http_server]
port=*:9001
username=your_username
password=your_password
Замените your_username
и your_password
введите нужные учетные данные, сохраните изменения и перезапустите службу супервизора.
sudo systemctl restart supervisord.service
Не забудьте разрешить TCP
доступ к порту 9001
на вашем брандмауэре, а затем доступ через http://{server-ip}:9001
браузер. Когда спрошено, предоставьте username
и password
. Теперь вы можете контролировать свои процессы из Интернета.
Вывод
Мы установили самую последнюю версию supervisord, узнали, как настроить ее для автоматического запуска системы с помощью systemd, а также рассмотрели основные возможности использования supervisorctl
. Для более сложной конфигурации и вариантов использования вы можете обратиться к официальной документации супервизора .