Система событий Upstart: что это такое и как ее использовать

Вступление

Initialization - это важная процедура, лежащая в основе любой операционной системы на базе Unix, для управления работой каждого сценария и службы. Это важно в серверной среде, где проблемы могут возникать в критических точках запуска и завершения работы и где обеспечение оптимальной производительности является приоритетом.

По сути, инициализация следует за этим видом процесса:

  1. Сервер загружается

  2. Выполняется процессinit (обычно какPID 1)

  3. Предопределенный набор задач запуска активируется последовательно

Инициализация отвечает за то, чтобы облачный сервер мог загружаться и корректно завершаться.

В некоторых дистрибутивах на основе Unix для инициализации используется стандартный процессinit. В этой статье мы рассмотримUpstart - практичную и мощную замену, которая может существенно повысить производительность вашего сервера.

Что не так с классическим init?

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

Процесс инициализации не может учитывать внезапные изменения в среде, а это означает, что ваш облачный сервер должен быть повторно инициализирован, прежде чем он сможет распознать дополнительное хранилище. Обнаружение «на лету» - это то, что нужно, хотя это не возможность классической процедуры инициализации.

Загрузка в линейной последовательности также требует времени, что особенно невыгодно в облачной среде, где необходимо быстрое развертывание.

Вы также можете быть обеспокоены состоянием ваших задач после загрузки системы. К сожалению,init влияет на последовательность только тогда, когда вы загружаетесь или выключаете.

Синхронные последовательности загрузки больше не желательны. Жесткая система может поддерживать системы вчерашнего дня, но сегодня она динамична.

Вот где приходитUpstart - решение этих проблем с расширенными возможностями.

На основе событийreal-time вместо заранее установленного списка задач в последовательности, этот заменяющий демон init обрабатывает запуск и остановку задач.and отслеживает эти процессы во время работы системы - «полное покрытие» является лучшим способ описать это.

Эта новая асинхронная обработка устраняет необходимость в жесткой последовательности загрузки. Обработка в реальном времени может быть сложной для понимания, но Upstart может поддерживать самые сложные системы и держать все под контролем, используя структуруjobs.

Обзор Upstart

Upstart Logo

Разработанная с самого начала гибко, система событий Upstart использует множество концепций, которые отличаются от традиционных систем инициализации. Решение установлено по умолчанию в Red Hat Enterprise Linux (RHEL) 6, а также в Google Chrome OS и Ubuntu, хотя недавние дебаты вызвали путаницу по поводу того, будет ли это продолжаться.

Jobs

В мире Upstart задания - это рабочие процессы, которые делятся на задания (с определенной целью) и задания по обслуживанию (которые могут выполняться в фоновом режиме). Существуют также абстрактные задания - процессы, которые выполняются вечно, пока не будут остановлены пользователем с правами администратора.

События

ОднакоEvents - это сигналы или «вызовы», используемые для запуска определенного действия с заданием или другим событием. Общие формы событий относятся к мониторингу процесса:starting,started,stopping иstopped.

Испускание событий

Процесс трансляции события называется «рассылкой». Обычно это вызвано состоянием процесса или задания, хотя администратор также может инициировать событие вручную, введя командуinitctl emit <event>. Вы заметите, что командаinit control становится невероятно полезной при навигации по множеству операций, связанных с Upstart.

Написание вашей первой конфигурации работы

Известно, что Upstart хорошо работает в Ubuntu, поэтому перед началом работы увеличьтеUbuntu 14.04 Droplet.

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

  • Он не должен быть пустым (файл без содержимого)

  • Он не должен содержать синтаксических ошибок

  • Он должен содержать хотя бы один командный блок, известный какstanza

Давайте пока оставим это базовым. Через мгновение мы создадим файл с именемtestjob.conf в каталоге/etc/init. В этом случае «init» просто используется как сокращенная версия «инициализации».

Обратите внимание на ассоциацию файлов.conf - это означает, что вы будете писатьjob configuration file.

Для целей этого руководства рекомендуется текстовый редактор командной строкиnano. Для некоторых из этих команд могут потребоваться права администратора сsudo, поэтому проверьтеthis article, чтобы создать подходящего пользователя.

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

sudo nano /etc/init/testjob.conf

Давайте теперь наметим цель. Мы хотим, чтобы эта работа выполняласьwrite a message and the current timestamp to a log file.

Есть две основные строфы, которые могут помочь вам определить цель сценария задания и кто его создал:description иauthor. Запишите это как ваши первые строки в файле.

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

Теперь мы хотим, чтобы эта работа выполнялась после того, как системные службы и процессы уже загружены (чтобы предотвратить любой конфликт), поэтому ваша следующая строка будет включать следующее событие:

start on runlevel [2345]

Вам может быть интересно, что такое уровень запуска. По сути, это единственное значение, которое представляет текущую конфигурацию системы. [2345] относится ко всем состояниям конфигурации с общим доступом Linux и сетью, что идеально подходит для базового тестового примера.

Затем мы добавим код выполнения. Эта строка начинается с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

Эта команда может использоваться для управления заданиями Upstart и другими фоновыми службами, такими как веб-сервер.

Основной синтаксис команды:

sudo service  

Этот синтаксис работает со следующими основными элементами управления:

  • перезагрузка: это остановит, затем запустите службу

  • start: запускает службу, если она не запущена

  • остановить: это остановит службу, если она работает

  • статус: будет отображаться статус сервиса

Мы хотим запустить наше тестовое задание вручную, поэтому команда должна выглядеть так:

sudo service testjob start

Теперь проверьте файлtestjob.log, выполнив следующую команду:

cat /var/log/testjob.log

Эта команда считывает файл в оболочку; Вы должны увидеть одну строку, аналогичную приведенной ниже:

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

Это показывает, что ваша тестовая работа настроена и готова к работе.

Перезагрузите Droplet, затем войдите в систему и снова прочитайте файл журнала:

cat /var/log/testjob.log

Вы должны увидеть вторую строку в журнале, отображающую более позднюю временную метку, чтобы подтвердить, что она выполнялась как задание Upstart.

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

Это просто царапает поверхность того, что вы можете сделать с Upstart. Мы рассмотрим подробный пример позже, но сейчас давайте перейдем к объяснению состояний работы и событий.

Рабочие состояния и события

Системные задания находятся в каталоге/etc/init/, а пользовательские задания находятся в собственном каталоге инициализации пользователя,~/.init/.

Задания пользователя выполняются в собственном сеансе пользователя, поэтому они также называются заданиями сеанса. Они не работают в рамках всей системы и не входят в обозначениеPID 1. В целях нашего тестового задания мы использовали/etc/init, чтобы он мог загружаться при загрузке системы.

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

У каждого из этих заданий есть цель -start илиstop. Между этими двумя целями находится набор состояний задач, которые определяют текущие действия задания в отношении цели. Важными состояниями являются следующие:

  • ожидание: начальное состояние обработки

  • Начало: где начинается работа

  • предварительный запуск: где загружен предварительный раздел

  • порожденный: где раздел сценария собирается запустить

  • post-start: где происходят операции после запуска

  • работает: где работа полностью в рабочем состоянии

  • предварительная остановка: где происходят предварительные остановки

  • остановка: где работа останавливается

  • убит: где работа остановлена

  • post-stop: где происходят пост-стопные операции - для очистки

После состояния после запуска задание определяется как работающее. Он продолжает работать до тех пор, пока не сработает предварительная остановка, когда задание будет готово к остановке, затем задание будет остановлено и будут выполнены процедуры пост-остановкиcleanup, если они определены.

Вы можете просмотреть, как задание переходит между состояниями, установив приоритет системного журнала Upstart (расположенный в каталоге/var/log/upstart/) наdebug с помощью этой команды:

sudo initctl log-priority debug

Помните, чтоstates are not events, and events are not states. Upstart испускает четыре события (запуск, запуск, остановка и остановка), но состояния задачи определяют переход между этапами жизненного цикла задания.

Теперь мы готовы перейти к более сфокусированному примеру, который включает элементы из вашей первой конфигурации, написав сервисное задание. Это продемонстрирует, как вы можете перейти от запуска базовых тестовых конфигураций к готовым сценариям.

Подробный пример: сервисное задание

Кратко описанная во введении, служебное задание включает файлы конфигурации сценариев, которые позволяют процессам работать в фоновом режиме. Мы создадимbasic Node.js server с нуля.

Если вы не знакомы с Node, по сути это «кроссплатформенная среда для серверных и сетевых приложений» (Википедия).

Node.js is a very lightweight package, although it isn’t installed by default on Ubuntu 14.04. Для начала установите его на свой облачный сервер.

sudo apt-get install nodejs

Теперь давайте начнем с сервисной работы. Создайте новый файл конфигурации задания в/etc/init с именемnodetest.conf. Наименование файла со ссылкой на его назначение имеет важное значение, поэтому вы сможете распознать, что это служебное задание предназначено для теста Node.js.

sudo nano /etc/init/nodetest.conf

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

Обо всем по порядку. Начните с ввода описания задания и авторских строк, чтобы определить конфигурацию.

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

Мы хотим, чтобы это серверное приложение на основе Node запускалось, когда сервер был запущен и работал, и останавливалось, когда оно корректно завершало работу. Из-за этого обязательно укажите оба условия:

start on filesystem or runlevel [2345]
stop on shutdown

Помните критерии раннего уровня из ранее? В сочетании с событиемfilesystem это гарантирует, что задание загружается, когда сервер запущен и работает нормально.

Это основы, но теперь все становится сложнее; мы собираемся использовать упомянутые ранееstanzas.

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

Если вы думаете, что это звучит знакомо, вы абсолютно правы. Предварительный запуск и предварительный останов - это рабочие состояния, но они также работают в строфах. Это означает, что различные команды могут выполняться в зависимости от состояния, в котором находится задание.

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

script

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

end script

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

Пришло время сосредоточиться наpre-start иpre-stop, которые будут использоваться для нашего простого журнала приложений. Дата вместе с сообщением о начале или остановке будет добавлена ​​в файл журнала для нашей работы:

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

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

pre-stop script
    rm /var/run/nodetest.pid
    echo "[`date`] Node Test Stopping" >> /var/log/nodetest.log
end script

Вот и вся сортированная конфигурация заданий Upstart; вот снова все для справки:

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 в желаемом месте (в этом примере используется/srv/):

sudo nano /srv/nodetest.js

Так как это учебник Upstart, мы не будем тратить слишком много времени на просмотр кода Node.js, хотя вот краткое изложение того, что этот скрипт будет выполнять:

  • Требовать и загружать HTTP-модуль Node

  • Создать HTTP веб-сервер

  • Укажите статус 200 (ОК) в заголовке ответа.

  • Напишите «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);

После сохранения файла Node.js последнее, что нужно проверить, - это допустим ли синтаксис задания Upstart. Как обычно, запустите команду проверки конфигурации, и вы получите подтверждение в виде вывода:

init-checkconf /etc/init/nodetest.conf

File nodetest.conf: syntax ok

Вы получили конфигурацию задания, проверили его синтаксис и сохранили код Node.js - все готово к работе, поэтому перезагрузите дроплет и затем посетитеhttp://IP:8888 или связанный домен.

Если вы встретили «Hello World» в верхнем левом углу окна, задание службы Upstart сработало!

Чтобы подтвердить ведение журнала на основе состояния, прочтите предопределенный файл журнала, и вы должны увидеть строку с отметкой времени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

Вы можете запустить стандартный запуск, остановку, перезапуск и т. Д. Команды для этой службы и любых других подобных заданий Upstart, с синтаксисом, подобным следующему:

sudo service nodetest restart

Заключение

Этот учебник только царапает поверхность системы событий Upstart. Вы ознакомились с основами традиционной инициализации, выяснили, почему решение Upstart с открытым исходным кодом является более мощным выбором, и начали писать свои собственные задания. Теперь, когда вы знаете основы, возможности безграничны.

Логотип с официального сайта Upstart, авторские права принадлежат оригинальным дизайнерам / Canonical Ltd.

Related