Система инициализации Upstart: что это такое и как это работает

Инициализация – это очень важная процедура, лежащая в основе любой операционной системы на основе Unix. Она управляет сервисами и сценариями. Особенно инициализация важна для серверов, которые нуждаются в оптимизации производительности.

Инициализация состоит из следующих этапов:

  • Загрузка сервера;
  • Запуск процесса init (как правило, он имеет PID 1);
  • Запуск последовательности предопределённых задач;

Инициализация обеспечивает корректный запуск и отключение сервера.

В данном руководстве речь пойдёт об Upstart – удобной и производительной системе инициализации.

Краткий обзор Upstart

Система Upstart изначально разрабатывалась с упором на гибкость, потому предлагает множество подходов, которых нет в стандартных системах инициализации. По умолчанию её использую т системы Red Hat Enterprise Linux (RHEL) 6, Chrome OS и дистрибутивы Ubuntu до версии 15.04.

Процессы

Upstart делит рабочие процессы (jobs) на задачи (task jobs) и сервисы (service jobs, могут работать в фоновом режиме). Также существуют процессы, которые работают до тех пор, пока их не остановит пользователь.

События

События – это сигналы, или вызовы, инициирующие определённое действие. Наиболее общим примером события является мониторинг процесса (starting, started, stopping, stopped).

Реализация событий

Процесс запуска события называется реализацией. Как правило, события запускаются процессами, но в случае необходимости администратор может запустить их вручную с помощью команды:

initctl emit <event>

Ещё одна полезная команда для работы с Upstart: init control.

Конфигурации процесса

Примечание: Система Upstart очень производительна в Ubuntu, потому в данном руководстве используется сервер Ubuntu 14.04.

Чтобы настройки процесса были валидными, конфигурационный файл должен соответствовать таким требованиям:

  • Он не должен быть пустым;
  • Не должен содержать ошибок;
  • Должен содержать хотя бы один блок команд (stanza).

Теперь попробуйте создать файл testjob.conf в каталоге /etc/init. Расширение файла .conf указывает на файл конфигураций процесса.

sudo nano /etc/init/testjob.conf

Пусть это процесс записывает сообщение и текущую метку времени в лог-файл.

Существует два блока, с помощью которых можно определить цель и автора процесса: description и author. С них должен начинаться файл:

description "A test job file for experimenting with Upstart"
author "Your Name"

Этот процесс должен загружаться после того, как загрузятся все остальные сервисы и процессы. Для этого добавьте строку:

start on runlevel [2345]

Уровень выполнения, или runlevel – это режим работы операционной системы компьютера. Уровни выполнения обозначаются цифрами от 0 до 6.

Теперь нужно добавить исполняемый код. Строка начинается с exec, чтобы обозначить, что данный код должен быть обработан оболочкой Bash.

exec echo Test Job ran at  `date` >> /var/log/testjob.log

Обратите внимание: команда echo использует обратные кавычки, чтобы запустить команду date, а затем записывает результат команды в лог. Если вы пропустите обратные кавычки, на экране просто отобразится слово date.

Сохраните и закройте файл.

Чтобы убедиться, что всё работает корректно, запустите процесс вручную. Но сначала нужно проверить синтаксис на ошибки:

init-checkconf /etc/init/testjob.conf

Если команда обнаружила ошибки, исправьте их. Если ошибок нет, команда вернёт:

File /etc/init/testjob.conf: syntax ok

При помощи следующей команды можно управлять процессами и фоновыми сервисами (например веб-сервером). Её базовый синтаксис:

sudo service <servicename> <control>

В поле control можно использовать такие команды:

  • restart: перезапуск
  • start: запуск
  • stop: остановка сервиса
  • status: состояние сервиса

Чтобы вручную запустить процесс, используйте команду:

sudo service testjob start

Теперь проверьте файл testjob.log:

cat /var/log/testjob.log

Эта команда прочитает заданный файл и выведет его содержимое:

Test Job ran at Fri Aug 1 08:43:05 BST 2014

Это значит, что тестовый процесс работает правильно.

Перезапустите сервер, войдите и снова запустите команду:

cat /var/log/testjob.log

В файле должна появиться ещё одна строка:

Test Job ran at Fri Aug 1 08:44:23 BST 2014

Так на примере одного процесса вы научились основам Upstart. Теперь пора ознакомиться с событиями и состояниями процессов.

Состояние процессов и события

Процессы системы хранятся в каталоге /etc/init/, а процессы пользователей – в каталоге ~/.init/.

Рабочие процессы пользователей запускаются в их сессиях. Такие процессы не являются общесистемными.

Все процессы независимо от их вида всегда определяются в конфигурационном файле (.conf), где их имя должно представлять сервис или выполняемую задачу.

Каждая такая задача имеет целью запуск (start) или остановку (stop). Между этими двумя целями находится ряд состояний задачи, который определяет текущее действие процесса в зависимости от цели.

  • waiting: исходное состояние процесса.
  • starting: подготовка к запуску.
  • pre-start: загрузка предпусковых задач.
  • spawned: запуск разделов сценария.
  • post-start: выполнение операций после запуска процесса.
  • running: процесс полностью запущен.
  • pre-stop: подготовка к остановке процесса.
  • stopping: остановка процесса.
  • killed: процесс остановлен.
  • post-stop: чистка окружения после остановки процесса.

Процесс в состоянии post-start считается запущенным процессом. Он остаётся запущенным до состояния pre-stop, в котором он готовится к остановке. После этого процесс останавливается и переходит в состояние post-stop (очистка системы).

Чтобы увидеть, как процесс изменяет свои состояния, переведите приоритет лога Upstart (/var/log/upstart/) в debug:

sudo initctl log-priority debug

Обратите внимание: состояния и события – не одно и то же.

Процессы сервисов

Процесс сервиса  использует конфигурационные файлы, которые позволяют запускать процессы в фоновом режиме.

Для примера попробуйте установить сервер Node.js.

Примечание: Node.js – это кроссплатформенная среда для серверных и сетевых приложений.

Node.js – очень лёгкий пакет, но по умолчанию он не установлен в Ubuntu 14.04. Чтобы установить его, введите:

sudo apt-get install nodejs

Теперь попробуйте создать сервис. Для этого создайте новый файл nodetest.conf в каталоге /etc/init.

sudo nano /etc/init/nodetest.conf

Примечание: Имя файла должно быть описательным.

Добавьте в файл описание и автора процесса:

description "Service for a test node.js server"
author      "Your Name"

Чтобы настроить автоматический запуск и отключение этого приложения на основе Node, добавьте в файл такие строки:

start on filesystem or runlevel [2345] stop on shutdown

Уровень запуска в сочетании с событием filesystem обеспечивает запуск процесса во время загрузки сервера.

Теперь нужно добавить в файл определённые ранее блоки. Поскольку это приложение является серверным, нужно добавить в конфигурации логирование. Чтобы регистрировать запуск и остановку приложения, используйте действия script, pre-start script и pre-stop script.

Как видите, pre-start и pre-stop – это состояния процессов, но их можно добавлять в блоки.

Сначала нужно добавить сам сценарий процесса. Он получит ID процесса для фонового сервера Node, а затем запустит сценарий приложения. Обратите внимание на отступы в блоке – они важны для корректного синтаксиса.

script

export HOME="/srv"
echo $$ > /var/run/nodetest.pid
exec /usr/bin/nodejs /srv/nodetest.js

end script

Приложению Node необходима переменная домашнего каталога, потому /srv экспортируется в первой строке блока. Символы $$ устанавливают PID процесса и создают файл для него.

Теперь сосредоточьтесь на pre-start и pre-stop. Дата, а также сообщения о запуске и остановке процесса, будут внесены в лог:

pre-start script

echo "[`date`] Node Test Starting" >> /var/log/nodetest.log

end script

Обратите внимание: блок pre-stop содержит строку, которая удаляет PID-файл. Эта задача будет частью процесса остановки.

pre-stop script

rm /var/run/nodetest.pid
echo "[`date`] Node Test Stopping" >> /var/log/nodetest.log

end script

В результате файл будет иметь такой вид:

description "Test node.js server"
author      "Your Name"
start on filesystem or runlevel [2345] stop on shutdown
script

export HOME="/srv"
echo $$ > /var/run/nodetest.pid
exec /usr/bin/nodejs /srv/nodetest.js

end script
pre-start script

echo "[`date`] Node Test Starting" >> /var/log/nodetest.log
end script

pre-stop script

rm /var/run/nodetest.pid
echo "[`date`] Node Test Stopping" >> /var/log/nodetest.log

end script

Сохраните и закройте файл.

Как сказано в строке exec, сценарий Node.js будет запущен с сервера, потому нужно создать файл nodetest.js:

sudo nano /srv/nodetest.js

Полученный сценарий выполняет следующие действия:

  • Запрашивает HTTP-модуль Node.
  • Создаёт веб-сервер HTTP.
  • Provide a status 200 (OK) response in the Header
  • Возвращает фразу Hello World.
  • Прослушивает порт 8888.

При помощи следующего кода можно запустить приложение Node:

var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);

Сохранив файл, убедитесь, что в синтаксисе нет ошибок.

init-checkconf /etc/init/nodetest.conf
File nodetest.conf: syntax ok

Убедившись, что код не содержит ошибок, перезапустите сервер и откройте ссылку:

http://IP:8888

На экране появится фраза Hello World.

Теперь нужно проверить, работает ли логирование. Откройте указанный в настройках лог и найдите в нём метки времени в строке Starting. После остановки сервиса в логе появится строка Stopping.

cat /var/log/nodetest.log
[Sun Aug 17 08:08:34 EDT 2014] Node Test Starting
[Sun Aug 17 08:13:03 EDT 2014] Node Test Stopping

Для запуска стандартных команд (start, stop, restart и т.д.) используется следующий синтаксис:

sudo service nodetest restart

Заключение

Данное руководство охватывает только основы работы с Upstart. Открытая система Upstart – производительное и надёжное средство для написания процессов.

Tags: , ,

Добавить комментарий