Пишем init скрипт

Принятие

Дистрибутивы и другие операционные системы, основанные на ядре Linux, которые используют Upstart в качестве системы по умолчанию инициализации:

Upstart был впервые включен в Ubuntu в 6.10 (Edgy EFT) релиз в конце 2006 года, заменив Sysvinit. Ubuntu 9.10 (Karmic Koala) представил родное Upstart загрузочная как альфа 6.В свою очередь, после того, как проект Debian решил принять Systemd на будущем выпуске в 2014 году Марк Шаттлворт заявил, что Ubuntu начнет планы перейти на Systemd себя поддерживать согласованность с вверх по течению.

  1. Upstart используется в Chrome OS от Google и Chromium OS.

дистрибутивы, которые поддерживают или поддерживали Upstart в какой-то степени, но отодвинулся, так или больше не используют его в качестве системы инициализации по умолчанию:

  • Debian решил, что Systemd будет Система инициализации по умолчанию, начиная с выпуска Jessie, после рассмотрения перехода на Upstart. В конечном итоге было удалено из архива Debian в декабре 2015 года.
  • Ubuntu закончил переключатель Systemd в качестве системы инициализации по умолчанию в версии 15.04 (Vivid Vervet), за исключением Ubuntu Touch.
  • В Fedora 9, Upstart заменил Sysvinit, однако, Systemd заменил Upstart в релизе Fedora 15.
  • Red Hat включает в себя Upstart в их Red Hat Enterprise Linux 6 выпуска. В результате, она также используется RHEL 6 вариантов, таких как CentOS, Scientific Linux и Oracle Linux. Для RHEL 7, Systemd используется вместо.
  • OpenSUSE включены Upstart в версии 11.3 Milestone 4, но не по умолчанию. Systemd заменил Upstart, как система инициализации по умолчанию в OpenSUSE 12.1.
  • Upstart используется в WebOS компании HP для Palm Pre, Palm Pixi (как до, Palm, был выкуплен HP), HP Veer и HP Pre 3 смартфоны, наряду с планшета HP TouchPad.
  • Upstart заменил Sysvinit в Maemo 5 для Nokia интернет-планшетов и был сохранен для MeeGo на телефонах N9 и N950, несмотря на MeeGo перехода к Systemd после слияния с Moblin.

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

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

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

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

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

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

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

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

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

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

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

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

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

Обратите внимание на отступы в блоке – они важны для корректного синтаксиса

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Example Systemd service

/lib/systemd/system/foo.service:


Description=Job that runs the foo daemon
Documentation=man:foo(1)


Type=forking
Environment=statedir=/var/cache/foo
ExecStartPre=/usr/bin/mkdir -p ${statedir}
ExecStart=/usr/bin/foo-daemon --arg1 "hello world" --statedir ${statedir}


WantedBy=multi-user.target

Outstanding Work

If you’d like to help out with the migration, take a look at …

  • Outstanding packages to convert:
    • http://people.canonical.com/~jhunt/systemd/packages-to-convert/

      Note that the priority are the packages in «main».

  • blueprint: https://blueprints.launchpad.net/ubuntu/+spec/core-1411-systemd-migration

… and then come and chat to us on #ubuntu-devel.

From a running system

Upstart

To switch to debug mode for the system init (PID 1):

  $ sudo initctl log-priority debug

To switch to debug mode for a session init (init PID != 1):

  $ initctl log-priority debug
  $ tail -f ~/.xsession-errors

Debian Packaging

Packages installing systemd services should build-depend on dh-systemd and either call dh --with systemd (if they use dh) or call dh_systemd_enable and dh_systemd_start before/after dh_installinit respectively. Files under debian called *.service will be installed analogously to *.upstart files. See dh_systemd_enable(1p) for how to customize the installation.

  • man systemd — «CONCEPTS» has an useful link collection to the per-topic pages

  • Ubuntu wiki systemd page (not relevant for porting)

  • Upstream systemd page with lots of documentation pointers

  • man 8 init, man 5 init (on an Upstart system)

  • systemd manpages for service writers:
  • Upstart

    Upstart Cookbook

Традиционный init

Вообще, если попытаться описать процесс загрузки Linux в двух словах, то это будет звучать примерно так. После включения компьютера, загрузки ядра в память, монтирования корневой файловой системы, опроса и инициализации оборудования передача управления по дальнейшей загрузке ОС передается специальному демону, называемому init. Задача init — это запуск всех остальных процессов, нужных для корректного функционирования ОС. В принципе, при помощи параметра ядра init можно указать ядру запускать все, что нам заблагорассудится (что в некоторых специфических дистрибутивах Linux и сделано), однако практически во всех традиционных дистрибутивах запускается именно демон init. Идея на самом деле очень простая и классная. Зачем ядру заморачиваться над запуском хреновой тучи приложений, если достаточно позаботиться лишь о запуске одного процесса, который и будет разруливать дальнейшую загрузку/работу/остановку системы.

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

  • 0 — система полностью прекратила работу
  • 1 или S — однопользовательский режим
  • 2…5 — многопользовательские режимы
  • 6 — перезагрузка системы

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

После запуска, демон init читает конфигурацию из файла /etc/inittab и на основании этой конфигурации начинает уже, так сказать, непосредственную деятельность. Грубо говоря, в файле /etc/inittab содержатся указания о том, что должен делать демон init на каждом из уровней.

В какой-то момент формат файла /etc/inittab оказался слишком устаревшим и перестал обеспечивать требуемую разработчиками функциональность, после чего в Linux появился каталог /etc/init.d, содержащий в себе файл /etc/init.d/rc

shell-сценарии запускающие все необходимое, а файл /etc/initttab стал выполнять функцию хранилища номера уровня по-умолчанию и вызова файла /etc/init.d/rc при смене уровней работы системы.

В каталоге /etc/init.d находятся сценарии запуска/перезапуска/останова системных служб. Все эти сценарии могут вызываться с разнообразными параметрами, обязательными из которых являются параметры start и stop. Нужно вам, например, запустить сервер sshd — вы просто даете команду /etc/init.d/sshd start и shell-сценарий делает все необходимо для запуска сервиса. Нужно остановить? Пожалуйста: /etc/init.d/sshd stop. Сам демон init работает не напрямую со сценариями, а следующим образом.

Существует несколько каталогов /etc/rcX.d, где X — это номер уровня работы системы. В каждом из этих каталогов находятся символьные ссылки на сценарии из каталога /etc/init.d. Довольно удобно, поскольку если нужно будет внести изменения в скрипт, то только в одном месте.

Каждая ссылка в каталоге /etc/rcX.d имеет вид YNNname, где Y — определяет параметр, передаваемый скрипту, NN — двузначный номер, name — имя файла сценария работы со службой из каталога /etc/init.d. Y должна быть одной из букв S или K, соответственно определяя, start или stop передавать скрипту. NN — задает очередность выполнения скриптов. Таким образом, при переходе на другой уровень работы системы, init сперва выполняет все K-сценарии в соответствующем текущему уровню каталоге /etc/rcX.d и потом выполняет все S-сценарии в соответствующем уровню, на который переходит система, каталоге /etc/rcX.d.

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

Таким вот, в принципе, несложным образом и живет ОС Linux от запуска до остановки. Заранее прошу прощения за мой местами кривой стиль изложения материала. Всех заинтересовавшихся более подробно темой работы демона init отправляю к man-страницам init (8), inittab (5), telinit (8), runlevel (8).

Что такое Upstart и чем он лучше

Начиная с Ubuntu 6.10 старый добрый init был заменен более функционально-продвинутым аналогом, которое авторы назвали Upstart. Основной козырь Upstart в том, что его работа основана на событиях. Это означает, что, в отличие от init, Upstart запускает и останавливает задачи не просто вызывая соответствующие shell-скрипты, а еще и наблюдает за работой запущенных им задач, основываясь на событиях, получаемых им от приложений. Это дает возможность, например, перезапустить в случае чего внезапно упавшую службу самим демоном Upstart, а не возлагать это на какие-то потусторонние программы.

Прежде чем продолжать дальше, хочется отметить, что в терминологии Upstart существует два понятия: служба (service) и задача (task). Главное отлицие службы от задачи состоит в том, что служба перезапускается в случае внезапного ее завершения, а задача — нет. Краткий перечень основных возможностей Upstart, взятый на сайте проекта:

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

Из функционала, который только планируется в будущих версиях Upstart на сайте отметили следующие моменты:

  • генерация событий через определенный интервал времени или с использованием планировщика
  • генерация событий в ответ на изменение содержимого файлов/каталогов
  • наблюдение и перезапуск демонов процессы которых отделены от родительских
  • возможность непривилегированным пользователям создавать свои собственные службы и управлять ими
  • связь с демоном init средствами DBUS

start on и stop on

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

Самое первое событие, которое генерирует Upstart — это событие startup. Данное событие происходит в тот момент, когда корневая файловая система еще не доступна для записи и отсутствует поддержка сети.

В случае с заданиями из архива с примерами, имеется также событие runlevel X, где X может быть числом от 1 до 6 или символом S. При генерации таких событий будут выполняться init-скрипты, соответствующие уровню запуска X.

И, наконец, вы можете управлять своими заданиями на основе событий, возникающих, в процессе запуска/останова других заданий. Для этого вы можете использовать события stopped и started.

Для определения событий, по которым ваше задание должно запускаться используйте запись start on, останавливаться — stop on. Все просто!

start on startup
start on runlevel 2
start on runlevel 3
start on stopped rcS
start on started tty1

Overview

Project is in maintaince mode only. No new features are being developed and the
general advice would be to move over to another minimal init system or systemd.

Upstart is an event-based replacement for the daemon
which handles starting of tasks and services during boot, stopping them
during shutdown and supervising them while the system is running.

It was originally developed for the Ubuntu
distribution, but is intended to be suitable for deployment in all
Linux distributions as a replacement for the venerable System-V init.

Most major users of Upstart have moved on. Commercial and security support for upstart
will stop be from Canonical once the last Ubuntu release shipping upstart lapses.

Project is in maintaince mode only. No new features are being developed and the
general advice would be to move over to another minimal init system or systemd.

Feature Highlights

  • Tasks and Services are started and stopped by events
  • Events are generated as tasks and services are started and stopped
  • Events may be received from any other process on the system
  • Services may be respawned if they die unexpectedly
  • Supervision and respawning of daemons which separate from their parent
    process
  • Communication with the init daemon over D-Bus
  • User services, which users can start and stop themselves

Known Users

  • Ubuntu
    • Introduction: 6.10
    • upstart as system init — last release — 14.04 LTS, public support ending April 2019
    • upstart as user init — last release — 16.04 LTS, public support ending April 2021
  • Fedora introduced in 9. Removed in 15.
  • Red Hat Enterprise Linux 6
  • Nokia’s Maemo platform
  • Palm’s WebOS
  • Google’s Chromium OS
  • Google’s Chrome OS

Recent News

  • 4 September 2014 Upstart 1.13.2 Released!
  • 16 July 2014 Upstart 1.13.1 Released!
  • 11 July 2014 Upstart 1.13 Released!
  • 11 March 2014 Upstart 1.12.1 Released!
  • 7 March 2014 Upstart 1.12 Released!
  • 14 November 2013 Upstart 1.11 Released!
  • 23 August 2013 Upstart 1.10 Released!
  • 4 July 2013 Upstart 1.9.1 Released!
  • 28 June 2013 Upstart 1.9 Released!
  • 22 March 2013 Upstart 1.8 Released!
  • 4 March 2013 Upstart 1.7 Released!
  • 7 December 2012 Upstart 1.6.1 Released!
  • 15 November 2012 Upstart 1.6 Released!
  • 22 March 2012 Upstart 1.5 Released!
  • 13 December 2011 Upstart 1.4 Released!
  • 14 June 2011 Upstart 1.3 Released!
  • 17 March 2011 Upstart 1.2 Released!
  • 17 March 2011 Upstart 1.1 Released!
  • 2 March 2011 Upstart 1.0 Released!
  • 14 Dec 2010 Upstart 0.6.7 Released!
  • 27 Apr 2010 Upstart 0.6.6 Released!
  • 4 Feb 2010 Upstart 0.6.5 Released!
  • 2 Aug 2009 Upstart 0.6.3 Released!
  • 21 Jul 2009 Upstart 0.6.2 Released!

Переназначение файлов

Переназначенные файлы — это файлы, размещённые в каталоге конфигураций задач («») и заканчивающиеся на «».
Эти файлы позволяют менять поведение задачи не изменяя оригинальный файл конфигурации.
Файлы переназначения имеют такой-же синтаксис, как и файлы конфигурации задач («.conf»).

Например, сделать так, чтобы сервис никогда не запускался автоматически:

  echo manual >> /etc/init/myjob.override

Вернуть первоначальное поведение можно удалив файл переназначения.

Другой пример: изменить условие запуска задачи:

  echo "start on (starting job-A or event-B)" >> /etc/init/myjob.override

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

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

Permanent switch back to upstart

Install the upstart-sysv package, which will remove ubuntu-standard and systemd-sysv (but should not remove anything else — if it does, yell!), and run sudo update-initramfs -u. After that, grub’s «Advanced options» menu will have a corresponding «Ubuntu, with Linux … (systemd)» entry where you can do an one-time boot with systemd.

If you want to switch back to systemd, install the systemd-sysv and ubuntu-standard packages.

High-level startup concept

Upstart’s model for starting processes (jobs) is «greedy event-based», i. e. all available jobs whose startup events happen are started as early as possible. During boot, upstart synthesizes some initial events like startup or rcS as the «tree root», the early services start on those, and later services start when the former are running. A new job merely needs to install its configuration file into /etc/init/ to become active.

systemd’s model for starting processes (units) is «lazy dependency-based», i. e. a unit will only start if and when some other starting unit depends on it. During boot, systemd starts a «root unit» (default.target, can be overridden in grub), which then transitively expands and starts its dependencies. A new unit needs to add itself as a dependency of a unit of the boot sequence (commonly multi-user.target) in order to become active.

Job vs. unit keywords

This maps the keywords that can occur in an upstart job to the corresponding ones in a systemd unit. Keywords which don’t have a direct equivalent are marked with «-«.

Upstart stanza

systemd unit file directive

systemd unit file section

Notes

apparmor load

AppArmorProfile

Available in systemd version 210 and later

apparmor switch

author

chdir

WorkingDirectory

Service

chroot

RootDirectory

console output

StandardOutput=tty, StandardError=tty

console owner

StandardOutput=tty, StandardError=tty

No real equivalent?

console none

StandardOutput=null, StandardError=null

description

Description

Unit

env

Environment, EnvironmentFile

Service

exec

ExecStart

Service

expect fork

Type=forking

Unit

expect daemon

Type=forking

Unit

expect stop

Type=notify

Unit

Similar, not equivalent. Requires daemon to link to libsystemd-daemon and call sd_notify().

instance

Use «%I» and «%i» in ExecStart, etc to specify an instance

See /lib/systemd/system/getty@.service for an example

kill signal

KillSignal

kill timeout

TimeoutStopSec

limit as

LimitAS

limit core

LimitCORE

limit cpu

LimitCPU

limit data

LimitDATA

limit fsize

LimitFSIZE

limit memlock

LimitMEMLOCK

limit msgqueue

LimitMSGQUEUE

limit nice

LimitNICE

limit nofile

LimitNOFILE

limit nproc

LimitNPROC

limit rss

LimitRSS

limit rtprio

LimitRTPRIO

limit sigpending

LimitSIGPENDING

limit stack

LimitSTACK

manual

No directive(?) — use systemctl disable foo.service

nice

Nice

Unit

normal exit

SuccessExitStatus

oom score

OOMScoreAdjust

post-start exec/script

ExecStartPost

Service

post-stop exec/script

ExecStopPost

Service

pre-start exec/script

ExecStartPre

Service

pre-stop

reload signal

ExecReload=/bin/kill -SIGFOO $MAINPID

Service

respawn

Restart=on-failure

Service

respawn limit

RestartSec

script/end script

See shell scripts below

setgid

Group

Service

setuid

User

Service

start on

Wants, Requires, Before, After

Unit

stop on

Conflicts, BindsTo (but not commonly used)

Unit

task

Type=oneshot

Unit

umask

UMask

Unit

usage

Documentation

Unit

no direct equivalent

version

Shell scripts

systemd does not provide special support for shell scripts (by design). For short shell commands you can use something like

   ExecStart=/bin/sh -ec 'echo hello'

Longer scripts are usually program logic and should not be directly in a conffile and duplicated between upstart and systemd; factor it out in a proper script in e. g. /usr/share/myapp/ and call it from both the upstart job and the systemd unit.

Automatic starting

As described above, services which want to start during boot (i. e. are not activated through sockets, D-BUS, or similar) need to become a dependency of an existing boot target. Those need an section with a WantedBy= that specifies the unit which that new service wants to become a dependency of (see man systemd.unit). Very commonly this is multi-user.target, which is roughly equivalent to start on runlevel  in upstart; see man systemd.special for other common targets.

Пишем Init скрипт

Инициализация — важнейшая процедура, лежащая в основе любой операционной системы на основе Unix/Linux для управления работой каждого скрипта и службы.

Я описывал в своих статьях процесс создания скриптов для systemD/Upstart и сейчас я хотел бы написать о написании init скриптов. Тема не новая и используется давно, но я большую часть своих тем беру именно из черновиков, которые накопились за года 3-4. У меня не хватает времени на все публикации + наполнять контент максимально (по крайней мере, сразу) и по этому, имеет что имеем. Но не смотря на это, у меня уже довольно много читателей — и это хорошо, это радует!

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

  • Загрузка сервера.
  • Запуск init процесса (обычно как PID 1).
  • Запуск предопределенного набора задач для запуска активируется последовательно.

Инициализация отвечает за то, чтобы сервер мог загрузиться и отключиться. В некоторых Unix/Linux дистрибутивах  используется стандартный процесс инициализации init/systemD/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:

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

Getting Started

Once you’ve downloaded and unpacked upstart, you
will need to configure the source tree, build and install it. The main
question here is deciding whether or not you want to take the plunge and
replace immediately, or whether you want to test first.

The brave will want to configure the source such that the executable parts
are placed on the root filesystem and the data parts (man pages, etc.) are
in the usual places.

./configure --prefix=/usr --exec-prefix= --sysconfdir=/etc

Everyone else will prefer to install it under an alternate prefix like
. You will need to boot with an alternate
kernel command-line such as .

./configure --prefix=/opt/upstart --sysconfdir=/etc

Job Definitions

Don’t reboot just yet, you haven’t configured anything to be started so
your machine will just sit there. You need to write some job definitions
that instruct upstart what to do, and when.

Upstart comes with a set of default jobs which it installs into
. These are based on the
configuration of Debian-based systems, including running the
script.

This is recommended, as it allows you to boot your machine normally, as well
as support existing applications, while you convert things to using upstart
jobs.

The defaults will probably need modification to work in your distribution,
as paths and maybe even arguments will need to be changed to match. Your
existing should be a useful guide.

Once happy, place the files in and now you’re
ready to reboot and use upstart.

Обоснование

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

  • Добавление или удаление USB флэш-накопителей и других портативных хранения / сетевых устройств, в то время как компьютер работает.
  • Обнаружение и сканирование новых устройств хранения данных, без блокировки системы, особенно, когда диск не может считываться даже без питания до тех пор, пока не будет сканироваться.
  • Загрузка прошивки для устройства, которое может потребоваться произойти после того, как оно было обнаружено, но прежде, чем она может использоваться.

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

Примеры Init скрипта

Приведу наглядный пример запуска томката.

Запуск TOMCAT с init

Создадим init скрипт для запуска:

# vim /etc/init.d/tomcat9

И приводим к виду:

#!/bin/bash -x
#
# Provides:          tomcat9
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start Tomcat.
# Description:       Start the Tomcat servlet engine.
### END INIT INFO

export CATALINA_HOME=/usr/local/tomcat9
export JAVA_HOME=/usr/local/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH

service_name="tomcat9"

start() {
 echo "Starting Tomcat 9..."
 /bin/su -s /bin/bash tomcat -c $CATALINA_HOME/bin/startup.sh
}
stop() {
 echo "Stopping Tomcat 9..."
 /bin/su -s /bin/bash tomcat -c $CATALINA_HOME/bin/shutdown.sh
}
status() {
 if (( $(ps -ef | grep -v grep | grep $service_name | wc -l) > 0 )); then
     echo "$service_name is running!!!"
 else
     echo "$service_name is down!!!"
 fi
}
case $1 in
  start|stop|status) $1;;
  restart) stop; start;;
  *) echo "Usage : $0 <start|stop|restart>"; exit 1;;
esac

exit 0

Даем права на запуск (на исполнение):

# chmod 755 /etc/init.d/tomcat9

ИЛИ:

# chmod +x /etc/init.d/tomcat9

Запускаем томкат:

# service tomcat9 start

Открываем браузер и смотрим что вышло!

Вот еще один скрипт:

#!/bin/bash -x

DAEMON_PATH="/home/wes/Development/projects/myapp"

DAEMON=myapp
DAEMONOPTS="-my opts"

NAME=myapp
DESC="My daemon description"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

case "$1" in
start)
	printf "%-50s" "Starting $NAME..."
	cd $DAEMON_PATH
	PID=`$DAEMON $DAEMONOPTS > /dev/null 2>&1 & echo $!`
	#echo "Saving PID" $PID " to " $PIDFILE
        if ; then
            printf "%s\n" "Fail"
        else
            echo $PID > $PIDFILE
            printf "%s\n" "Ok"
        fi
;;
status)
        printf "%-50s" "Checking $NAME..."
        if ; then
            PID=`cat $PIDFILE`
            if ; then
                printf "%s\n" "Process dead but pidfile exists"
            else
                echo "Running"
            fi
        else
            printf "%s\n" "Service not running"
        fi
;;
stop)
        printf "%-50s" "Stopping $NAME"
            PID=`cat $PIDFILE`
            cd $DAEMON_PATH
        if ; then
            kill -HUP $PID
            printf "%s\n" "Ok"
            rm -f $PIDFILE
        else
            printf "%s\n" "pidfile not found"
        fi
;;

restart)
  	$0 stop
  	$0 start
;;

*)
        echo "Usage: $0 {status|start|stop|restart}"
        exit 1
esac

Подойдет к большинству скриптов, а для остальных — можно отредактировать немного.

И, вот еще полезный довольно вариант:

#!/bin/sh
### BEGIN INIT INFO
# Provides:
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

dir=""
cmd=""
user=""

name=`basename $0`
pid_file="/var/run/$name.pid"
stdout_log="/var/log/$name.log"
stderr_log="/var/log/$name.err"

get_pid() {
    cat "$pid_file"
}

is_running() {
     && ps -p `get_pid` > /dev/null 2>&1
}

case "$1" in
    start)
    if is_running; then
        echo "Already started"
    else
        echo "Starting $name"
        cd "$dir"
        if ; then
            sudo $cmd >> "$stdout_log" 2>> "$stderr_log" &
        else
            sudo -u "$user" $cmd >> "$stdout_log" 2>> "$stderr_log" &
        fi
        echo $! > "$pid_file"
        if ! is_running; then
            echo "Unable to start, see $stdout_log and $stderr_log"
            exit 1
        fi
    fi
    ;;
    stop)
    if is_running; then
        echo -n "Stopping $name.."
        kill `get_pid`
        for i in 1 2 3 4 5 6 7 8 9 10
        # for i in `seq 10`
        do
            if ! is_running; then
                break
            fi

            echo -n "."
            sleep 1
        done
        echo

        if is_running; then
            echo "Not stopped; may still be shutting down or shutdown may have failed"
            exit 1
        else
            echo "Stopped"
            if ; then
                rm "$pid_file"
            fi
        fi
    else
        echo "Not running"
    fi
    ;;
    restart)
    $0 stop
    if is_running; then
        echo "Unable to stop, will not attempt to start"
        exit 1
    fi
    $0 start
    ;;
    status)
    if is_running; then
        echo "Running"
    else
        echo "Stopped"
        exit 1
    fi
    ;;
    *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac

exit 0

Вот и все, статья «Пишем Init скрипт» завершена.

Установка UpStart

Графическая установка

https://youtube.com/watch?v=xiJSfPrRl14

Первым делом, проверяем, соответствует ли наша система требованиям:

  • Linux >= 2.6.17
  • GCC >= 4.1
  • glibc >= 2.4

Конфигурируем исходный код для компиляции:

О дополнительных возможных параметрах конфигурирования можно узнать из файла INSTALL, находящегося непосредственно в корне дерева исходных кодов.

Собираем: make

Устанавливаем: make install

Описание заданий

После успешной установки Upstart, необходимо создать определения заданий для того, чтобы система смогла загрузиться. Другими словами, задания как раз есть, что чем оперирует Upstart в своей работе. Чтобы быстрей понять, как это все делается и, так сказать, увидеть своими глазами, можно скачать архив примеров заданий. Возможно, вам придется их немного видоизменить для корректной работы с вашей системой, однако все необходимое для начальной конфигурации системы и успешного первого запуска в архиве примеров есть. Все примеры необходимо распаковать в каталог /etc/event.d. Именно из него Upstart берет все необходимое для работы (про /etc/inittab все дружно забыли). За исключением моментов описанных в разделе «Upstart on Other Distributions» все скрипты в каталогах /etc/rcX.d можно оставить без изменений. все должно заработать.

Последний штрих и перезагрузка

Когда все готово, можно попробовать перегрузить Linux и посмотреть, что у вас получилось. Перед перезагрузкой не забудьте проверить значение параметра init, передаваемого ядру вашим загрузчиком, в случае, если Upstart установил исполняемый файл init в отличный от /sbin каталог. Вообще, в принципе, настоятельно рекомендуется для начала не заменять стандартный sysvinit на init Upstart, а установить его в какой-то другой каталог и при помощи параметра ядра init сперва все тщательно протестировать.

Пишем задания

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

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

Имена файлов должны соответствовать именам заданий и сами файлы не должны быть исполняемыми.

Все задания помещаются в файлы, расположенные в каталоге . Имена файлов должны соответствовать именам заданий и сами файлы не должны быть исполняемыми.

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

Boot Time

Remove the following from the kernel command-line via the grub menu:

  • «quiet»

  • «splash»

Upstart

  • Add «--debug to the kernel command-line via the grub menu.

  • Optionally add «console=ttyS0 to the kernel command-line via the grub menu if you have a serial console.

systemd

  • Add «systemd.log_level=debug  to the kernel command-line via the grub menu.

  • Optionally add one of the following too:
    • «systemd.log_target=kmsg»

    • «systemd.log_target=console»

Starting a rescue shell

  • Run:

    $ sudo systemctl enable debug-shell.service

  • Reboot.
  • If the system fails to boot, you can now switch to tty9 (CTRL+ALT+F9) for a getty console login.

exec и script

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

exec /bin/foo --opt -xyz foo bar

Запись script используется для вставки bash-кода непосредственно в файл задания. Все, что вы здесь укажете, будет выполнено стандартным интерпретатором /bin/sh с параметром -e, таким образом позволяя прервать скрипт в случае неправильного использования любой команды. Запись script должна заканчиваться строкой «end script».

script
# do some stuff
if ; then
...
fi
end script

/etc/default files which enable/disable jobs

enable=1|0 type settings in /etc/default files should generally be avoided. The canonical way to enable/disable a service in an init system agnostic way is update-rc.d <service> enable|disable, which will translate to init system specific actions such as adding/removing symlinks (SysV and systemd) or creating/removing job override files (upstart). For systemd in particular, admins also often call systemctl enable|disable <service> directly. Thus these settings are redundant in /etc/default.

There is no clean way to evaluate these in a systemd unit. You can check them in ExecStartPre=, but that would mean that the unit will be in «failed» state if the service gets disabled that way, and so, is not desirable.

For these reasons (confusing/duplication/cannot be modelled in systemd), these settings should be removed. This was done in whoopsie 0.2.42, you can check its diff for a transition which respects the old default setting and removes it on upgrade.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: