Как установить Supervisor и управлять им
Введение
Во многих средах VPS часто бывает так, что у вас будет несколько небольших программ, которые вы хотите постоянно запускать, будь то небольшие сценарии оболочки, приложения Node.js или любые пакеты большого размера.
Обычно внешние пакеты поставляются с файлом модуля, который позволяет управлять ими с помощью системы инициализации, такой как образы докеров, которыми может управлять механизм контейнера. Однако для программного обеспечения, которое плохо упаковано, или для пользователей, которые предпочитают не взаимодействовать с низкоуровневой системой инициализации на своем сервере, полезно иметь облегченную альтернативу.
Supervisor — это менеджер процессов, который предоставляет единый интерфейс для управления и мониторинга ряда долго работающих программ. В этом руководстве вы установите Supervisor на сервер Linux и узнаете, как управлять конфигурациями Supervisor для нескольких приложений.
Предпосылки
Для выполнения этого руководства вам потребуется:
- Сервер Linux и пользователь без полномочий root с привилегиями sudo. Вы можете узнать больше о том, как настроить пользователя с этими привилегиями, в нашем руководстве Initial Server Setup with Ubuntu 20.04.
Шаг 1 - Установка
Начните с обновления исходников пакетов и установки Supervisor:
- sudo apt update && sudo apt install supervisor
Служба супервизора запускается автоматически после установки. Вы можете проверить его статус:
- sudo systemctl status supervisor
Вы должны получить следующий вывод:
Output● supervisor.service - Supervisor process control system for UNIX
Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-11-17 22:56:48 UTC; 5min ago
Теперь, когда у нас установлен Supervisor, мы можем добавить наши первые программы.
Шаг 2 — Добавление программы
Лучшей практикой для работы с Supervisor является создание файла конфигурации для каждой программы, с которой он будет работать.
Все программы, запущенные под Supervisor, должны выполняться в режиме без демонизации (иногда также называемом «режимом переднего плана»). Если по умолчанию ваша программа автоматически возвращается в оболочку после запуска, вам может потребоваться обратиться к руководству программы, чтобы найти возможность включения этого режима, иначе Supervisor не сможет правильно определить статус программы.
Чтобы продемонстрировать функциональные возможности Supervisor, мы создадим сценарий оболочки, который не делает ничего, кроме создания некоторого предсказуемого вывода раз в секунду, но будет непрерывно работать в фоновом режиме, пока не будет остановлен вручную. Используя nano
или ваш любимый текстовый редактор, откройте файл с именем idle.sh
в вашем домашнем каталоге:
- nano ~/idle.sh
Добавьте следующее содержимое:
#!/bin/bash
while true
do
# Echo current date to stdout
echo `date`
# Echo 'error!' to stderr
echo 'error!' >&2
sleep 1
done
Сохраните и закройте файл. Если вы используете nano
, нажмите Ctrl+X
, затем при появлении запроса Y
и Enter.
Затем сделайте ваш скрипт исполняемым:
- chmod +x ~/idle.sh
Файлы конфигурации для программ Supervisor расположены в каталоге /etc/supervisor/conf.d
, обычно запуская одну программу в каждом файле и заканчиваясь на .conf.
Мы создадим файл конфигурации для этого скрипта, как \\/etc/supervisor/conf.d/idle.conf:
- sudo nano /etc/supervisor/conf.d/idle.conf
Добавьте это содержимое:
command=/home/ubuntu/idle.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/idle.err.log
stdout_logfile=/var/log/idle.out.log
Мы рассмотрим это построчно:
command=/home/ubuntu/idle.sh
Настройка начинается с определения программы с именем idle
и полного пути к программе:
autostart=true
autorestart=true
Следующие две строки определяют автоматическое поведение скрипта при определенных условиях.
Параметр autostart
сообщает Supervisor, что эта программа должна запускаться при загрузке системы. Установка этого параметра в false потребует ручного запуска после любого выключения системы.
autorestart
определяет, как Supervisor должен управлять программой в случае ее выхода:
false
указывает Supervisor никогда не перезапускать программу после ее выхода.true
указывает Supervisor всегда перезапускать программу после ее выхода.unexpected
указывает Supervisor перезапустить программу только в том случае, если она завершится с неожиданным кодом ошибки (по умолчанию любой другой код, кроме кодов 0 или 2). Чтобы узнать больше о кодах ошибок, ознакомьтесь с командойerrno
.
stderr_logfile=/var/log/idle.err.log
stdout_logfile=/var/log/idle.out.log
Последние две строки определяют расположение двух основных файлов журнала программы. Как следует из названий опций, stdout и stderr будут направлены в папки stdout_logfile
и stderr_logfile
соответственно. Указанные каталоги должны уже существовать, поскольку Supervisor не будет пытаться создать какие-либо отсутствующие каталоги.
Конфигурация, которую мы здесь создали, является минимальным шаблоном для программы Supervisor. В документации Supervisor перечислены многие другие дополнительные параметры конфигурации, доступные для настройки запуска программ.
Как только наш файл конфигурации создан и сохранен, мы можем сообщить Supervisor о нашей новой программе с помощью команды supervisorctl
. Сначала мы говорим Supervisor искать любые новые или измененные конфигурации программы в каталоге /etc/supervisor/conf.d
с помощью:
- sudo supervisorctl reread
Outputidle: available
Затем следует сообщить ему о вступлении в силу любых изменений с помощью:
- sudo supervisorctl update
Outputidle: added process group
Каждый раз, когда вы вносите изменения в любой файл конфигурации программы, выполнение двух предыдущих команд приведет к тому, что изменения вступят в силу.
На данный момент наша программа должна работать. Мы можем проверить его вывод, просмотрев файл журнала вывода:
- sudo tail /var/log/idle.out.log
OutputSat Nov 20 22:21:22 UTC 2021
Sat Nov 20 22:21:23 UTC 2021
Sat Nov 20 22:21:24 UTC 2021
Sat Nov 20 22:21:25 UTC 2021
Sat Nov 20 22:21:26 UTC 2021
Sat Nov 20 22:21:27 UTC 2021
Sat Nov 20 22:21:28 UTC 2021
Sat Nov 20 22:21:29 UTC 2021
Sat Nov 20 22:21:30 UTC 2021
Sat Nov 20 22:21:31 UTC 2021
Далее мы рассмотрим некоторые другие способы использования Supervisor.
Шаг 3 — Управление программами
Помимо запуска программ, вы захотите остановить, перезапустить или просмотреть их статус. Программа supervisorctl, которую мы использовали в шаге 2, также имеет интерактивный режим, который мы можем использовать для управления нашими программами.
Чтобы войти в интерактивный режим, запустите supervisorctl без аргументов:
- sudo supervisorctl
Outputidle RUNNING pid 12614, uptime 1:49:37
supervisor>
supervisorctl
сначала распечатает статус и время работы всех настроенных программ, а затем свою командную строку. Вход в help
покажет все доступные команды:
- supervisor> help
Outputdefault commands (type help <topic>):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version
Вы можете запустить
или остановить
программу с соответствующими командами, за которыми следует имя программы:
- supervisor> stop idle
Outputidle: stopped
- supervisor> start idle
Outputidle: started
Используя команду tail
, вы можете просмотреть самые последние записи в журналах stdout и stderr для вашей программы:
- supervisor> tail idle
OutputSun Nov 21 00:36:10 UTC 2021
Sun Nov 21 00:36:11 UTC 2021
Sun Nov 21 00:36:12 UTC 2021
Sun Nov 21 00:36:13 UTC 2021
Sun Nov 21 00:36:14 UTC 2021
Sun Nov 21 00:36:15 UTC 2021
Sun Nov 21 00:36:17 UTC 2021
- supervisor> tail idle stderr
Outputerror!
error!
error!
error!
error!
error!
error!
Используя status
, вы можете снова просмотреть текущее состояние выполнения каждой программы после внесения каких-либо изменений:
- supervisor> status
Outputidle STOPPED Nov 21 01:07 AM
Наконец, вы можете выйти из supervisorctl, нажав Ctrl+C или введя quit
в командной строке:
- supervisor> quit
Заключение
Из этого руководства вы узнали, как установить Supervisor и управлять им. Как уже упоминалось, Supervisor очень легкий по современным стандартам, но его по-прежнему хорошо обслуживают, и он может быть полезным инструментом для небольших развертываний. Кроме того, это не требующий особого обслуживания и автономный способ создания журналов в качестве составной части более крупного развертывания.
Если вы используете несколько небольших приложений, которые должны быть доступны через Интернет, вы также можете прочитать о настройке Nginx в качестве обратного прокси-сервера, что является еще одним фундаментальным компонентом небольших повторно используемых развертываний.