Пишем Upstart скрипт
Upstart — это система инициализации ОС, которая управляет запуском демонов в течение загрузки системы, их остановку, а также управляет ими во время работы системы. Основанная на событиях замена системы инициализации init в UNIX и Linux системах. Изначально разрабатывалась для дистрибутива Ubuntu, но предназначен для развертывания во всех дистрибутивах Linux в качестве альтернативной замены.
Основные характеристики
- Задачи и службы запускаются и/или останавливаются через события;
- События генерируются при запуске и остановке задач и сервисов;
- События могут быть получены от любого другого процесса в системе;
- Слыжбы могут быть возрождены, если они неожиданно кильнулись;
- Наблюдение и возрождение демонов, которые отделены от их родительского процесса;
- Связь с init демоном через D-Bus;
- Пользовательские сервисы, которые пользователи могут запускать и останавливать сами.
И так, хотелось бы рассказать как можно запускать томкат. Но для начала, нужно узнать какой механизм инициализации используется:
# ps -s1| awk '{print $4}'| grep -Ev "CMD"
Т.к речь идет о Upstart, то и продолжим тему.
PS: Вот еще полезное чтиво:
Система инициализации в Unix/Linux
Система инициализации SysVinit
Инициализация — важнейшая процедура, лежащая в основе любой операционной системы на основе Unix/Linux для управления работой каждого скрипта и службы.
По сути, инициализация следует за этим процессом:
- Загрузка сервера.
- Запуск init процесса (обычно как PID 1).
- Запуск предопределенного набора задач для запуска активируется последовательно.
Инициализация отвечает за то, чтобы сервер мог загрузиться и отключиться. В некоторых Unix/Linux дистрибутивах используется стандартный процесс инициализации init/systemD/Upstart. В этой статье я расскажу о том, как использовать Upstart или Init.
Традиционная инициализация следует за линейным процессом: загрузка отдельных задач в предопределенную последовательность при загрузке системы. Это не так полезно, особенно в быстро меняющихся ситуациях. Чтобы понять, почему, представьте, например, вы изменили среду сервера, добавив дополнительное устройство хранения.
Процесс инициализации не может принимать во внимание внезапные изменения в среде, а это означает, что ваш облачный сервер должен быть повторно инициализирован, прежде чем он сможет распознать дополнительное хранилище. Обнаружение «на лету» — это то, что необходимо, хотя это не возможность классической процедуры инициализации.
Загрузка в линейную последовательность также требует времени, что особенно невыгодно в облачной среде, где быстрое развертывание имеет важное значение.
Вы также можете быть обеспокоены состоянием своих задач после загрузки системы. К сожалению, init связан с последовательностью только при загрузке или отключении питания.
Синхронные последовательности загрузки больше не желательны. На смену init-у, пришел Upstart — решение этих проблем с расширенными возможностями.
На основе событий в реальном времени вместо заданного списка задач в последовательности этот замещающий демон инициализации запускает и останавливает задачи и контролирует эти процессы во время работы системы — «полный охват» — лучший способ описать его.
Эта новая асинхронная обработка устраняет необходимость в жесткой последовательности загрузки. Обработка в режиме реального времени может быть беспорядочной для концептуализации, но Upstart может поддерживать самые сложные системы и держать все под контролем, используя структуру задач.
Jobs
В мире Upstart, jobs — это рабочие процессы, разделенные на задания (целью) и рабочие задания (которые могут выполняться в фоновом режиме). Существуют также абстрактные задания — процессы, которые выполняются всегда, до тех пор, пока пользователь не будет заблокирован административными привилегиями.
Events
Однако событиями являются сигналы или «вызовы», используемые для запуска определенного действия с заданием или другим событием. Общие формы событий относятся к мониторингу процесса: запуск (пред-запуск) и остановка (пред-остановка).
Emitting Events
Процесс трансляции события называется «испусканием» (emitting). Обычно это вызвано состоянием процесса или задания, хотя администратор также может выпустить событие вручную, выпустив «initctl emit <event>» команду.
Состояния Job и Events
Джобы (задания или job-ы) в системе находятся в каталоге /etc/init/, а задания пользователя находятся в собственном каталоге ~/.init/.
Пользовательские задания запускаются в собственной сессии пользователя, поэтому они также известны как сеансовые задания. Они не работают в общесистемном режиме и не входят в обозначение PID1.
Независимо от его типа, задание всегда определяется в файле конфигурации (.conf), где его имя файла должно представлять связанную службу или задачу.
У каждой из этих заданий есть цель — запустить или остановить. Между этими двумя целями находятся множество состояний задач, которые определяют текущие действия работы в отношении цели. Важными являются следующие состояния:
- waiting: Начальное состояние процесса.
- starting: Запуск джобы.
- pre-start: Загрузка или пред-старт некоторых действий.
- spawned: Начало скрипта.
- post-start: После-запуск или действия после запуска задания.
- running: Запущенная джоба.
- pre-stop: Пред-остановка или действия который выполняються перед остановкой задания.
- stopping: Остановка джобы.
- killed: Прибиваение процесса. Остановка задания.
- post-stop: После-остановка или действия после остановки джобы.
После post-start состояния, задание определяется как running (запущено). Он остается включенным до тех пор, пока не будет выполнена предварительная остановка, когда задание будет готово к остановке, тогда работа будет убита, а процедуры очистки после остановки выполнят свои действия( если они будут определены).
Вы можете просмотреть, как задание переходит между состояниями, установив приоритет системного журнала Upstart (расположенный в каталоге /var/ log/upstart/) для отладки с помощью этой команды:
# initctl log-priority debug
Помните, что состояния не являются событиями, а события не являются состояниями. Четыре события (starting, started, stopping и stopped) испускаются Upstart, но состояния задачи определяют переход между этапами жизненного цикла работы.
Примеры Upstart скриптов
Открываем (создаем) файл:
# vim /etc/init/testjob.conf
Для начала, прописываем следующие строки:
description "My first Upstart script" author "Vitaliy Natarov"
Тем самым, я описал что это за скрипт (поле description) и прописал автора (поле — author). После чего, сейчас я пропишу следующую строку для того чтобы это задание выполнялось после того, как системные службы и процессы уже загружены (чтобы предотвратить конфликт):
start on runlevel [2345]
Возможно, вам интересно, что такое уровень запуска. По сути, это единственное значение, которое представляет текущую конфигурацию системы. [2345] относится ко всем состояниям конфигурации с общим доступом к Linux и сетям, что идеально подходит для базового тестового примера.
Идем дальше и прописываем следующей строчкой:
stop on shutdown
Это остановит созданную задачу при отключения питания (завершения работы) сервера.
Затем мы добавим код выполнения:
script echo $$ > /var/run/testjob.pid end script
Определим действия перед запуском:
pre-start script echo "[`date`] testjob Starting" >> /var/log/testjob.log end script
Так же, определим пред-остановку:
pre-stop script rm /var/run/nodetest.pid echo "[`date`] testjob Stopping" >> /var/log/testjob.log end script
Сохраните и закройте этот файл.
Вы можете убедиться, что это работает, вручную запустив задание, но давайте сначала проверим синтаксис файла конфигурации:
# init-checkconf /etc/init/testjob.conf
Если обнаружены какие-либо проблемы, эта команда укажет номер конкретную линию(ии) и проблему. Однако с тестовым заданием вы должны увидеть вывод следующим образом:
File /etc/init/testjob.conf: syntax ok
Эта команда может использоваться для управления заданиями Upstart и другими фоновыми службами, такими как веб-сервер.
Основной синтаксис команды:
# service <servicename> <control>
Где, <control> может быть:
- restart — Перезапустит службу.
- start — Запустит службу.
- stop — Остановит службу.
- status — Проверит состояние службы.
Давайте запустим написанный скрипт:
# service testjob start
Теперь проверьте файл testjob.log, выполнив следующую команду:
# cat /var/log/testjob.log
Я не буду больше заострять внимания т.к это уже не актуально и в большенстве случаев, уже используется systemD/init скрипты.
Вот и все, статья «Пишем Upstart скрипт» завершена.