В среде многих выделенных серверов часто встречается ряд программ, которые должны работать постоянно, будь то небольшие сценарии оболочки, приложения Node.js, некоторые объемные пакеты.
Конечно, для каждой из этих программ можно написать init-скрипт, но такой подход требует больших затрат времени и ресурсов и не всегда понятен новичкам.
Supervisor – это менеджер процессов, который существенно упрощает управление долго работающими программами, предоставляя простой и понятный интерфейс.
Примечание: Для выполнения данного руководства необходимо уметь работать с командной строкой и устанавливать пакеты, а также иметь базовые навыки управления сервером.
Процесс установки Supervisor в системы Ubuntu и Debian предельно прост, поскольку предварительно собранные пакеты можно найти в репозиториях обеих операционных систем.
Чтобы установить Supervisor, запустите следующую команду с привилегиями root:
apt-get install supervisor
После выполнения этой команды демон Supervisor будет уже запущен, поскольку предварительно собранные пакеты поставляются с init-скриптом (благодаря чему Supervisor будет перезапускаться при каждой перезагрузке системы). Чтобы убедиться, что все работает должным образом, наберите:
service supervisor restart
Итак, теперь Supervisor установлен; попробуйте добавить в него некоторые программы.
Иногда файл конфигурации супервизора не создается автоматически после установки, и вам приходится писать его вручную:
echo_supervisord_conf > /etc/supervisor/supervisord.conf sudo supervisord -c /etc/supervisor/supervisord.conf sudo supervisorctl status
sudo apt-get remove supervisor sudo apt-get remove --auto-remove supervisor sudo apt-get purge supervisor sudo apt-get purge --auto-remove supervisor
Новые программы добавляются в Supervisor посредством конфигурационных файлов, которые передают переменные среды и сообщают, какой из исполнительных файлов нужно запустить в определенный момент, как обрабатывать вывод.
Примечание: все программы, запущенные через Supervisor, должны работать в режиме non-daemon (который также называется приоритетным режимом). В противном случае Supervisor не сможет определить статус программы. Чтобы включить данный режим, обратитесь к документации и мануалам необходимых программ.
Для примера предположим, что на сервере есть скрипт оболочки, который должен работать постоянно; он находится в /usr/local/bin/long.sh и выглядит так:
#!/bin/bash while true do # Echo current date to stdout echo `date` # Echo 'error!' to stderr echo 'error!' >&2 sleep 1 done chmod +x /usr/local/bin/long.sh
Конечно, в практическом смысле, этот сценарий явно бессмысленный, но зато он позволит продемонстрировать основы настройки Supervisor.
Конфигурационные файлы Supervisor находятся в каталоге /etc/supervisor/conf.d (как правило, по файлу с расширением .conf на каждую программу). Простая конфигурация для скрипта, сохраненного в /etc/supervisor/conf.d/long_script.conf, будет иметь такой вид:
[program:long_script] command=/usr/local/bin/long.sh autostart=true autorestart=true stderr_logfile=/var/log/long.err.log stdout_logfile=/var/log/long.out.log
Ниже приведено описание каждой строки и некоторые тонкие настройки, которые могут пригодиться в дальнейшем.
[program:long_script] command=/usr/local/bin/long.sh
Конфигурация начинается с определения программы и полного пути к ней.
autostart=true autorestart=true
Эти строки определяют базовое автоматическое поведение скрипта в определенных условиях. Опция autostart запускает программу при загрузке системы; значение false заставит включать программу вручную. Опция autorestart определяет, как Supervisor будет управлять программой в случае ее отключения, и имеет три опции:
stderr_logfile=/var/log/long.err.log\\ stdout_logfile=/var/log/long.out.log
Последние две строки определяют местонахождение двух основных лог-файлов программы. В соответствии с именами опций, stdout и stderr задают расположение файлов stdout_logfile и stderr_logfile.
Только что созданная конфигурация – это минимальный шаблон для внесения программы в Supervisor. В документации проекта можно найти множество дополнительных опций конфигурации для тонкой настройки.
Создав конфигурационный файл, нужно известить Supervisor о появлении новой программы; для этого используется команда supervisorctl. Сначала Supervisor должен просмотреть каталог /etc/supervisor/conf.d на наличие новых или измененных программ:
supervisorctl reread
Затем можно активировать новые конфигурации:
supervisorctl update
Примечание: чтобы эти изменения вступили в силу, всегда запускайте две вышеперечисленные команды после редактирования любого конфигурационного файла программы.
На данный момент программа должна быть запущена; это можно проверить при помощи лог-файла:
$ tail /var/log/long.out.log Sat Jul 20 22:21:22 UTC 2013 Sat Jul 20 22:21:23 UTC 2013 Sat Jul 20 22:21:24 UTC 2013 Sat Jul 20 22:21:25 UTC 2013 Sat Jul 20 22:21:26 UTC 2013 Sat Jul 20 22:21:27 UTC 2013 Sat Jul 20 22:21:28 UTC 2013 Sat Jul 20 22:21:29 UTC 2013 Sat Jul 20 22:21:30 UTC 2013 Sat Jul 20 22:21:31 UTC 2013
[program:listener_brand_211_uwsgi] ; Имя программы в supervisor, например будет выводится в supervisorctl process_name=%(program_name)s_%(process_num)02d ; Вы можете указать сколько таких процессов надо запустить, по умолчанию 1 numprocs=2 ; Путь до проекта (chdir) directory=/var/www/wildberries/listen ; Команда для запуска программы command=/home/parser_wb/.nvm/versions/node/v16.10.0/bin/node /var/www/wildberries/listen/brand.js AMQP_URL=79.143.73.211 ; Из под какого пользователя запускать программу user=root ; При загрузке самого supervisor запускать программу autostart=true ; Если программа аварийно завершилась, то перезапускать её autorestart=true ; Перенаправляет пришедший STDERR в ответ supervisor в STDOUT (эквивалент /the/program 2>&1) stderr_logfile=/var/www/wildberries/listen/log
После запуска программ, несомненно, наступит момент, когда их понадобится остановить, перезапустить или просмотреть их статус. Ранее упомянутая программа supervisorctl имеет интерактивный режим, который позволяет управлять программами Supervisor.
Чтобы включить интерактивный режим, запустите supervisorctl без аргументов:
$ supervisorctl long_script RUNNING pid 12614, uptime 1:49:37 supervisor>
После запуска supervisorctl выведет статус и аптайм всех программ, а также откроет командную строку.
Опция help выведет на экран все доступные команды:
supervisor> help default commands (type help ): <nowiki>=====================================</nowiki> add clear fg open quit remove restart start stop update avail exit maintail pid reload reread shutdown status tail version
Для начала попробуйте запустить, остановить и перезапустить программу при помощи следующих команд (команды start, stop, restart + имя программы):
supervisor> stop long_script long_script: stopped supervisor> start long_script long_script: started supervisor> restart long_script long_script: stopped long_script: started
Команда tail выведет самые последние записи в логах stdout и stderr для заданной программы:
supervisor> tail long_script Sun Jul 21 00:36:10 UTC 2013 Sun Jul 21 00:36:11 UTC 2013 Sun Jul 21 00:36:12 UTC 2013 Sun Jul 21 00:36:13 UTC 2013 Sun Jul 21 00:36:14 UTC 2013 Sun Jul 21 00:36:15 UTC 2013 Sun Jul 21 00:36:17 UTC 2013 supervisor> tail long_script stderr error! error! error! error! error! error! error!
Команда status покажет текущее состояние выполнения программы после внесения каких-либо изменений:
supervisor> status long_script STOPPED Jul 21 01:07 AM
Завершив работу с supervisorctl, закройте интерфейс при помощи комбинации Ctrl-C или команды quit:
supervisor> quit
Чтобы добавить web-интерфейс для управления процессам, supervisor через браузер, достаточно прописать в конфиге, supervisord.conf, дополнительные настройки.
[inet_http_server] ; inet (TCP) server disabled by default port=0.0.0.0:9001 ; ip_address:port specifier, *:port for all iface username=parser_wb ; default is no username (open server) password=parser_wb ; default is no password (open server)
небходимо указать host:port и придумать логин и пароль для входа.