Управление демонами с помощью Upstart и Supervisor в Ubuntu 14.04
Руководство по управлению демонами в Ubuntu 14.04 с помощью утилит Upstart и Supervisor. В мануале мы будем контролировать демон обработки Artisan очередей (Laravel 4.2). Предположим, что нам необходимо запустить фоновый сервис (демон) и поддерживать его в рабочем состоянии, т.е. перезапускать в случае сбоя или по требованию.
Внимание!
Обратите внимание также на супервизор сервисов runit
(http://habrahabr.ru/post/83775/). Он не вошел в это руководство из-за нехватки времени.
Supervisor
Это утилита написана на Python и предназначена для управления процессами ОС. Мы рассмотрим только отслеживание состояния демонов (фоновых сервисов) и их перезапуск в случае необходимости. Тулза предоставляет системный и web интерфейсы для управления сервисами (демонами).
Установка на Ubuntu 14.04 тривиальна:
sudo apt-get install supervisor
После установки вам будет доступен сервис supervisor (его демон supervisord) со всеми возможностями контроля: status, start, restart, stop. А также консольная утилита для управления наблюдаемыми демонами - supervisorctl.
Проверим статус сервиса supervisor:
sudo service supervisor status
Для запуска WEB GUI интерфейса создайте файл конфигурации /etc/supervisor/conf.d/web-gui.conf (или добавьте эту секцию в /etc/supervisor/supervisord.conf):
[inet_http_server]
port=127.0.0.1:9001
username=YOUR_USER ; Данные для HTTP Basic Authentication
password=YOUR_PASS
Примерно так выглядит web-морда супервайзера
Создаем файл конфигурации сервиса, который будет следить за нашим демоном очередей (/etc/supervisor/conf.d/my_app_queue.conf):
[program:my_app_queue]
directory=/var/www/my_app
command=php artisan queue:listen --timeout=720 --tries=3 --env=production
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/my_app_queue.err.log
stdout_logfile=/var/log/supervisor/my_app_queue.out.log
Внимание!
После добавления/редактирования конфигурации нового сервиса необходимо "перечитать" конфиги:
sudo supervisorctl reread
sudo supervisorctl update
или перезапустить сервис supervisor:
sudo service supervisor restart
Консоль supervisorctl предоставляет возможность управлять запущенными демонами:
$ sudo supervisorctl
supervisor> status
supervisor> restart SERVICE-NAME # перезапуск демона
supervisor> stop SERVICE-NAME # будет остановлен сервис и сам слушатель artisan
supervisor> help
supervisor> quit
Также, вы можете управлять сервисами без входа в консоль supervisorctl, но вы не получите дополнение имен сервисов в консоли:
sudo supervisorctl restart SERVICE-NAME
Вот, собственно, и все... Теперь supervisor будет контролировать чтобы обработчик Laravel очередей всегда был запущен. Если желаете узнать побольше о возможностях supervisor, рекомендую к прочтению статью: http://adw0rd.com/2012/11/2/python-supervisor/
Upstart
Эта утилита также предоставляет контроль за демонами и возможность реагировать на события системы. Утилита Upstart включена в дистрибутивы Ubuntu по-умолчанию, поэтому под Ubuntu вроде как и нет особого смысла ставить supervisor.
Создаем файл конфигурации сервиcа /etc/init/my-app-queue-caretaker.conf:
#!upstart
description "Run the Laravel Queues Caretaker"
start on runlevel [2345]
stop on runlevel [!2345]
console output
env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
cd /project/dir && php artisan queue:work --daemon
respawn
Внимание!
После добавления нового файла конфигурации сервиса необходимо перечитать конфиги:
sudo initctl reload-configuration
Каждый конфиг upstart сервиса должен содержать либо script
(набор sh команд) либо exec
(одно строчная команда для запуска исполняемого файла).
Всеми сервисами upstart управляет утилита initctl.
Имя сервиса будет соответствовать имени файла конфигурации без расширения .conf.
Например, для запуска сервиса my-app-queue-caretaker
выполните:
sudo initctl start my-app-queue-caretaker
# или через алиас:
sudo start my-app-queue-caretaker
Логи upstart сервисов лежат в /var/log/upstart/%service-name%.log.
Команды управления:
sudo initctl start MY_SERVICE (или просто - start MY_SERVICE) запускает сервис MY_SERVICE
sudo initctl stop MY_SERVICE (или просто - stop MY_SERVICE) запускает сервис MY_SERVICE
#daemon, #services, #supervisord, #upstart, #background tastk