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. Для более сложной конфигурации и вариантов использования вы можете обратиться к официальной документации супервизора .