- мЙЮОЩЕ ЪБРЙУЙ Linux, РТПЗТБННЩ — РТПВМЕНЩ Й ТЕЫЕОЙС
- linux-notes.org
- Система инициализации в Unix/Linux
- Добавить комментарий Отменить ответ
- Системы инициализации Unix и Linux после SysV
- DJB и Daemontools
- Сравнительная таблица DT
- Структура DT
- Зависимости между службами
- Квотирование сервиса
- Логирование
- Последователи daemontools
мЙЮОЩЕ ЪБРЙУЙ
Linux, РТПЗТБННЩ — РТПВМЕНЩ Й ТЕЫЕОЙС
уЙУФЕНЩ ЙОЙГЙБМЙЪБГЙК linux
уХЭЕУФЧХЕФ ОЕУЛПМШЛП УЙУФЕН ЙОЙГЙБМЙЪБГЙЙ. тБУУНПФТЙН ЙИ:
1) уЙУФЕНБ ЙОЙГЙБМЙЪБГЙЙ init (Ч РТПГЕУУЕ ЪБРХУЛБ СДТБ НПОФЙТХЕФУС ЛПТОЕЧБС ЖБКМПЧБС УЙУФЕНБ Й ЪБРХУЛБЕФУС РТПЗТБННБ init, ЛПФПТБС Й ЧЩРПМОСЕФ ДБМШОЕКЫХА ЙОЙГЙБМЙЪБГЙА УЙУФЕНЩ).
2) уЙУФЕНБ initng (РПЪЧПМСЕФ УХЭЕУФЧЕООП ХУЛПТЙФШ ЪБРХУЛ Linux, ОП ПОБ РПЛБ ЕЭЕ ЬЛУРЕТЙНЕОФБМШОБС, РПЬФПНХ ОЕ ХУФБОБЧМЙЧБЕФУС Ч ДЙУФТЙВХФЙЧБИ РП ХНПМЮБОЙА. пДОБЛП ЧЩ НПЦЕФЕ УБНПУФПСФЕМШОП ЕЕ ХУФБОПЧЙФШ Й РПРТПВПЧБФШ ЙУРПМШЪПЧБФШ — ХДБМЙФШ ЕЕ ЧУЕЗДБ НПЦОП, ЕУМЙ ПОБ ЧБУ ЮЕН-ФП ОЕ ХУФТПЙФ)
3) уЙУФЕНБ upstart ВЩМБ УРЕГЙБМШОП ТБЪТБВПФБОБ ДМС ДЙУФТЙВХФЙЧБ Ubuntu Linux, ОП ЕЕ РТЙ ЦЕМБОЙЙ НПЦОП ХУФБОПЧЙФШ Ч МАВПН ДЙУФТЙВХФЙЧЕ.
оБЮОЕН РП РПТСДЛХ:
1) уЙУФЕНБ ЙОЙГЙБМЙЪБГЙЙ init
рТПЗТБННБ init ЮЙФБЕФ ЛПОЖЙЗХТБГЙПООЩК ЖБКМ /etc/inittab Й ЪБРХУЛБЕФ ДТХЗЙЕ РТПГЕУУЩ, УПЗМБУОП ЙОУФТХЛГЙСН ЬФПЗП ЖБКМБ.
пДОБ ЙЪ ЗМБЧОЩИ ЙОУФТХЛГЙК ЖБКМБ /etc/inittab ЧЩЗМСДЙФ ФБЛ:
id: : initdefault
ьФБ ЙОУФТХЛГЙС ЪБДБЕФ ХТПЧЕОШ ЪБРХУЛБ РП ХНПМЮБОЙА. хТПЧЕОШ ЪБРХУЛБ ПРТЕДЕМСЕФ, ЛБЛЙЕ ДЕКУФЧЙС ВХДХФ ЧЩРПМОЕОЩ РТПЗТБННПК init (ЛБЛЙЕ РТПГЕУУЩ ЪБРХЭЕОЩ). чУЕЗП РТЕДХУНПФТЕОП ЫЕУФШ ХТПЧОЕК ЪБРХУЛБ:
0 — ПУФБОПЧЛБ УЙУФЕНЩ (СУОП, ЮФП Ч ЛБЮЕУФЧЕ ХТПЧОС РП ХНПМЮБОЙА ЬФПФ хТПЧЕОШ ВЩФШ ОЕ НПЦЕФ);
1 — ПДОПРПМШЪПЧБФЕМШУЛЙК ТЕЦЙН (Ч ОЕЗП НПЦОП РЕТЕКФЙ УТБЪХ РТЙ ЪБЗТХЪЛЕ, РЕТЕДБЧ СДТХ РБТБНЕФТ single);
2 — НОПЗПРПМШЪПЧБФЕМШУЛЙК ТЕЦЙН ВЕЪ РПДДЕТЦЛЙ УЕФЙ;
3 — НОПЗПРПМШЪПЧБФЕМШУЛЙК ТЕЦЙН У РПДДЕТЦЛПК УЕФЙ;
4 — ОЕ ЙУРПМШЪХЕФУС;
5 — НОПЗПРПМШЪПЧБФЕМШУЛЙК ЗТБЖЙЮЕУЛЙК ТЕЦЙН У ЪБЗТХЪЛПК X11 Й РПДДЕТЦЛПК УЕФЙ;
6 — РЕТЕЪБЗТХЪЛБ УЙУФЕНЩ.
ч ВПМШЫЙОУФЧЕ УМХЮБЕЧ Ч ЛБЮЕУФЧЕ ХТПЧОС ЪБРХУЛБ РП ХНПМЮБОЙА ХУФБОБЧМЙЧБЕФУС 3 ЙМЙ 5.
рЕТЕКФЙ ОБ ФПФ ЙМЙ ЙОПК ХТПЧЕОШ НПЦОП Й РПУМЕ ЪБЗТХЪЛЙ УЙУФЕНЩ. дМС ЬФПЗП ЙУРПМШЪХЕФУС ЛПНБОДБ:
# /sbin/init ‘ХТПЧЕОШ_ЬБРХУЛБ’
«пРТЕДЕМЙЧ» ХТПЧЕОШ ЪБРХУЛБ, init РППЮЕТЕДОП ЪБРХУЛБЕФ УГЕОБТЙЙ ЙЪ ЛБФБМПЗБ /etc/rc.d/rcX.d, ЗДЕ X — ЬФП ОПНЕТ ХТПЧОС ЪБРХУЛБ. еУМЙ ЪБКФЙ Ч ПДЙО ЙЪ ЬФЙИ ЛБФБМПЗПЧ, ОБРТЙНЕТ, Ч
/etc/rc.d/rc3.d, ФП НПЦОП ХЧЙДЕФШ УУЩМЛЙ ЖПТНБФБ:
S ‘ОПНЕТ»ЙНС’
рБТБНЕФТ ‘ОПНЕТ’ ПРТЕДЕМСЕФ РПТСДПЛ ЪБРХУЛБ УГЕОБТЙС (ОБРТЙНЕТ, SlOnetwork ЪБРХУФЙФУС ТБОШЫЕ, ЮЕН S11internet), Б РБТБНЕФТ ‘ЙНС’ — ЪБДБЕФ ЙНС УГЕОБТЙС. уБНЙ УГЕОБТЙЙ ОБИПДСФУС Ч ЛБФБМПЗЕ /etc/rc.d/init.d.
уУЩМЛЙ, ОБЮЙОБАЭЙЕУС ОБ УЙНЧПМ S, — ЬФП УУЩМЛЙ ЪБРХУЛБ (ПФ S, start), РТЙ ЪБРХУЛЕ УППФЧЕФУФЧХАЭЙИ УГЕОБТЙЕЧ ЙН ВХДЕФ РЕТЕДБО БТЗХНЕОФ start. оБРТЙНЕТ, ЕУМЙ init ПВОБТХЦЙМБ Ч /etc/rc.d/rc3.d ЖБКМ SlOnetwork, ФП ПОБ ЧЩРПМОЙФ ЛПНБОДХ:
/etc/rc.d/init.d/network start
еУМЙ ЙНС УУЩМЛЙ ОБЮЙОБЕФУС ОБ ВХЛЧХ л (ПФ kill), ФП ЬФП УУЩМЛБ ПУФБОПЧЛЙ УЕТЧЙУБ, ОБРТЙНЕТ, лп1service. дБООБС УУЩМЛБ ХЛБЪЩЧБЕФ ОБ ЛПНБОДХ:
/etc/rc.d/init.d/service stop
0О НПЦЕФЕ ЪБРХУФЙФШ МАВПК УГЕОБТЙК ЙЪ ЛБФБМПЗБ init.d ОЕРПУТЕДУФЧЕООП, РЕТЕДБЧ ЕНХ РБТБНЕФТЩ start (ЪБРХУЛ), stop (ПУФБОПЧЛБ) Й ДТХЗЙЕ (ЪБЧЙУЙФ ПФ УЕТЧЙУБ). б НПЦЕФЕ ЧПУРПМШЪПЧБФШУС ЛПНБОДПК service:
# service ‘ЙНС_УЕТЧЙУБ’ ‘start|stop|..’
ъДЕУШ ‘ЙНС УЕТЧЙУБ’ — ЬФП ЙНС ЖБКМБ Ч ЛБФБМПЗЕ /etc/rc.d/init.d.
оБРТЙНЕТ ДМС ЪБРХУЛБ Apache НПЦОП ЙУРПМШЪПЧБФШ ЛПНБОДХ:
# rcapache start
тЕДБЛФЙТПЧБФШ ХТПЧОЙ ЪБРХУЛБ НПЦОП ЧТХЮОХА, Б НПЦОП Й У РПНПЭША РТПЗТБНН-ЛПОЖЙЗХТБФПТПЧ:
Ч Fedora — ЛПОЖЙЗХТБФПТ system-config-services;
Ч Ubuntu ДП ЧЕТУЙЙ 9.04 РТЙНЕОСЕФУС ЛПОЖЙЗХТБФПТ services-admin, Б Ч ЧЕТУЙЙ 9.10 УМЕДХЕФ ЙУРПМШЪПЧБФШ ЛПОЖЙЗХТБФПТ bum, ЛПФПТЩК ОХЦОП ХУФБОПЧЙФШ ПФДЕМШОП:
sudo apt-get install bum
2) уЙУФЕНБ ЙОЙГЙБМЙЪБГЙЙ initng
Initng — ЬФП УЙУФЕНБ ЙОЙГЙБМЙЪБГЙЙ Linux УМЕДХАЭЕЗП рПЛПМЕОЙС, РПЪЧПМСАЭБС УХЭЕУФЧЕООП ХУЛПТЙФШ ЪБРХУЛ Linux.
б ЪБ УЮЕФ ЮЕЗП ДПУФЙЗБЕФУС ХУЛПТЕОЙЕ ЪБРХУЛБ Linux? B РПЮЕНХ ОБН Ч ДБМШОЕКЫЕН РТЙДЕФУС РЕТЕКФЙ ОБ initng? ч РТПГЕУУЕ ЪБЗТХЪЛЙ Linux ЪБРХУЛБЕФУС СДТП, ПОП НПОФЙТХЕФ ЛПТОЕЧХА ЖБКМПЧХА УЙУФЕНХ Й ЪБРХУЛБЕФ РТПЗТБННХ init йНЕООП init ЧЩРПМОСЕФ ЧУА ДБМШОЕКЫХА ЙОЙГЙБМЙЪБГЙА УЙУФЕНЩ. рЕТЧЩН ДЕМПН init ЮЙФБЕФ РПМЕ initdefauit Ч ЖБКМЕ /etc/inittab — ЬФП ХТПЧЕОШ ЪБРХУЛБ РП ХНПМЮБОЙА. ч ЪБЧЙУЙНПУФЙ ПФ ХТПЧОС ЪБРХУЛБ init ЪБРХУЛБЕФ УГЕОБТЙЙ, ОБИПДСЭЙЕУС Ч ПДОПН ЙЪ РПДЛБФБМПЗПЧ ЛБФБМПЗБ /etc/rУ.d.
Initng ТБВПФБЕФ ЙОБЮЕ. пОБ ОЕ ЪБРХУЛБЕФ УГЕОБТЙЙ, Б УБНБ ЧЩРПМОСЕФ ДЕКУФЧЙС ХЛБЪБООЩЕ Ч ЖБКМБИ, ЙЗТБАЭЙИ ТПМШ УГЕОБТЙЕЧ ЙОЙГЙБМЙЪБГЙЙ. ч УМХЮБЕ ЦЕ У ПВЩЮОЩН init ОБ УБНПН ДЕМЕ ЙОЙГЙБМЙЪЙТХЕФ УЙУФЕНХ bash, a init ФПМШЛП ЪБРХУЛБЕФ ОХЦОЩЕ УГЕОБТЙЙ — ФП ЕУФШ ЧЩРПМОЕОЙЕ РЕТЕДБЕФУС ДТХЗПК РТПЗТБННЕ (bash), ЛПФПТБС ЬФЙ УГЕОБТЙЙ Й ЧЩРПМОСЕФ. A initng УБНБ, ВЕЪ РПУТЕДОЙЛПЧ, ЧЩРПМОСЕФ ЙОЙГЙБМЙЪБГЙА УЙУФЕНЩ, ЪБ УЮЕФ ЮЕЗП Й ДПУФЙЗБЕФУС УПЛТБЭЕОЙЕ ЧТЕНЕОЙ ЪБЗТХЪЛЙ (Л УПЦБМЕОЙА РПЛБ УЙУФЕНБ initng ОЕ РПМХЮЙМБ ПУПВПЗП ТБУРТПУФТБОЕОЙС — ПОБ ОЕ ЙУРПМШЪХЕФУС ОЙ Ч ПДОПН УПЧТЕНЕООПН ДЙУФТЙВХФЙЧЕ).
3) уЙУФЕНБ ЙОЙГЙБМЙЪБГЙЙ upstart
уЙУФЕНБ ЙОЙГЙБМЙЪБГЙЙ upstart ВЩМБ ТБЪТБВПФБОБ уЛПФПН дЦЕКНУПН тЕНОБОФПН (Scott James Remnant) ДМС ДЙУФТЙВХФЙЧБ Ubuntu, ПДОБЛП upstart НПЦОП У ХУРЕИПН ЙУРПМШЪПЧБФШ Ч ДТХЗЙИ ДЙУФТЙВХФЙЧБИ.
3.1. лБЛ ТБВПФБЕФ upstart
ч upstart ЕУФШ УПВУФЧЕООЩК РТПГЕУУ init, ЛПФПТЩК ЪБРХУЛБЕФУС РТЙ ЪБРХУЛЕ УЙУФЕНЩ (БОБМПЗЙЮОП РТoЗТБННБН init Й initng). рТЙ ЪБРХУЛЕ ЗЕОЕТЙТХЕФУС УПВЩФЙЕ startup, РТЙ ЪБЧЕТЫЕОЙЙ ТБВПФЩ — shutdown, РТЙ ОБЦБФЙЙ ОБ Ctrl+Alt+Del — УПВЩФЙЕ ctrl-alt-delete.
чЩ НПЦЕФЕ УПЪДБЧБФШ УПВУФЧЕООЩЕ УПВЩФЙС. чПФ ОЕВПМШЫПК РТЙНЕТ УПЪДБОЙС УПВЩФЙС my_event:
on my_event
eИЕУ echo event received
console output
рТЙ РПМХЮЕОЙЙ ЬФПЗП УПВЩФЙС ОБ ЛПОУПМШ ВХДЕФ ЧЩЧЕДЕОП УППВЭЕОЙЕ:
event received
жБКМЩ УПВЩФЙК ИТБОСФУС Ч ЛБФБМПЗЕ /etc/event.d. уПЪДБКФЕ Ч ЬФПН ЛБФБМПЗЕ ЖБКМ У ЙНЕОЕН my_event Й РПНЕУФЙФЕ Ч ОЕЗП РТЙЧЕДЕООЩК ЛПД. рПУМЕ ЬФПЗП ЧЩЪЧБФШ УПВЩФЙЕ НПЦОП ЛПНБОДПК:
initctl emit my_event
вПМЕЕ РПДТПВОХА ЙОЖПТНБГЙА ПВ ЬФПК ЛПНБОДЕ НПЦОП РТПЮЙФБФШ ОБ УФТБОЙГЕ ТХЛПЧПДУФЧБ: man initctl.
3.2. лПОЖЙЗХТБГЙПООЩЕ ЖБКМЩ upstart
йУУМЕДХКФЕ УПДЕТЦЙНПЕ ЛБФБМПЗБ /etc/event.d. ч ОЕН ЧЩ ОБКДЕФЕ ЖБКМЩ УПВЩФЙК РЕТЕИПДБ ОБ ПРТЕДЕМЕООЩК ЪБРХУЛ.
уБНПЕ ЙОФЕТЕУОПЕ Ч upstart — ХТПЧОЙ ЪБРХУЛБ ЪДЕУШ — ЧЙТФХБМШОЩЕ. ч upstart, ВМБЗПДБТС УПВЩФЙКОП-ПТЙЕОФЙТПЧБООПНХ ТЕЦЙНХ, ЧППВЭЕ ПФРБДБЕФ ОЕПВИПДЙНПУФШ Ч ХТПЧОСИ ЪБРХУЛБ, РПДПВОЩИ ФЕН, ЛПФПТЩЕ ЙУРПМШЪПЧБМЙУШ Ч init. ъБЗТХЪЛБ ФПЗП ЙМЙ ЙОПЗП УЕТЧЙУБ РТПЙУИПДЙФ РТЙ ОБМЙЮЙЙ ОХЦОПЗП БРРБТБФОПЗП ПВЕУРЕЮЕОЙС: ОЕФ ХУФТПКУФЧБ — ОЕ ВХДЕФ ЪБЗТХЦЕО Й УЕТЧЙУ, ФТЕВХАЭЙК ЕЗП.
Upstart НПЦОП ЙУРПМШЪПЧБФШ Ч ТЕЦЙНЕ «ЗПТСЮЕК ЪБНЕОЩ» — ЕУМЙ ЧЩ Ч РТПГЕУУЕ ТБВПФЩ УЙУФЕНЩ РПДЛМАЮЙФЕ ЛБЛПЕ-ФП ХУФТПКУФЧП, ОБРТЙНЕТ, PCMCIA-ЛБТФХ ЙМЙ USB-ХУФТПКУФЧП, ВХДЕФ УЗЕОЕТЙТПЧБОП УППФЧЕФУФЧХАЭЕЕ УПВЩФЙЕ. рПУМЕ ЬФПЗП ВХДХФ ЪБРХЭЕОЩ ЧУЕ ОЕПВИПДЙНЩЕ ДМС ПВЕУРЕЮЕОЙС ТБВПФЩ ЬФПЗП ХУФТПКУФЧБ РТПГЕУУЩ. фБЛ, РТЙ РПДЛМАЮЕОЙЙ УЕФЕЧПК ЛБТФЩ PCMCIA ВХДЕФ УЗЕОЕТЙТПЧБОП УПВЩФЙЕ network-interface-added, ЛПФПТПЕ ЪБРХУФЙФ РТПГЕУУ ОБУФТПКЛЙ УЕФЕЧПК ЛБТФЩ РП DHCP, РТЙ ЬФПН ВХДЕФ УЗЕОЕТЙТПЧБОП ОПЧПЕ УПВЩФЙЕ — network-interface-up Й Ф.Д. еУФЕУФЧЕООП, ЕУМЙ ОЕФ УЕФЕЧЩИ ХУФТПКУФЧ, ФП Й УППФЧЕФУФЧХАЭЙЕ ЙН УПВЩФЙС ОЕ ВХДХФ ЗЕОЕТЙТПЧБФШУС.
Источник
linux-notes.org
Иногда интересно какая же инициализация используется на сервере и в моей статье «Система инициализации в Unix/Linux» я расскажу как можно узнать какая система инициализации используется на сервере.
Основные системы инициализации:
- sysvinit — Стиль SysVinit существовал еще со времен SystemV, которая была разработана еще в 1983 году. Это установило стандарт инициализации POSIX систем.
- upstart — система инициализации ОС, которая управляет запуском демонов в течение загрузки системы, их остановку, а также управляет ими во время работы системы. Первоначально была разработана для дистрибутива Ubuntu, но затем стала использоваться и в других дистрибутивах Linux, например в Fedora (впоследствии была заменена systemd), как замена UNIX System V init.
- systemd — это системный менеджер, (демон для инициализации других демонов в Linux), который пришел и почти заменил SysV. Основное отличие — распределенный запуск служб в процессе загрузки системы, что позволяло существенно ускорить запуск операционной системы.
- launchd — система инциализации системы с открытым исходным кодом, используемая в ОС Mac OS X. Процесс имеет PID 1 и занимается тем, что запускает другие процессы и перезапускает их в случае сбоя, то есть выполняет функции init UNIX и Linux (в новых версиях Linux осуществляется переход на systemd).
Команды по системам инициализации в Unix/Linux ОС:
Система инициализации в Unix/Linux
Существует несколько способов проверить это, сейчас я покажу как это сделать.
-=== СПОСОБ 1 — проверка PID процессов==-
Например, Ubuntu до версии 14 использовала систему инициализацию Upstart чтобы проверить это, выполните:
Например, Ubuntu 16 и CentOS 7 использовала систему инициализацию SystemD чтобы проверить это, выполните:
Или если используется Ubuntu 16, можно выполнить:
Или, другой пример:
Или (если чтобы было красиво):
Например, CentOS 6 использовала систему инициализацию Upstart, но с init процессом и чтобы проверить это, выполните:
-=== СПОСОБ 2 — проверка файлов==-
Запускаем следующую команду:
Если на сервере используется init инициализация, то она отобразится при выводе. В противном случае — скажет что такой команды нет.
ИЛИ, можно выполнить:
Вот вам еще довольно стоящий пример:
-=== СПОСОБ 3 — с помощью ФС==-
Можно запустить следующую команду:
Команда что выше, проверяет exe симлинку в папке /proc/1. А собственно «1» – это PID 1-го процесса.
-=== СПОСОБ 4 — с помощью готового bash скрипта==-
И прописываем в него:
Можно добавить прав на исполнение:
И для запуска, юзаем:
-=== СПОСОБ 5 — с помощью пакетного менеджера==-
Если используете centOS/RedHat/Fedora/Suse, то можно выполнить:
Если используете Debian/Ubuntu/Mint/др, то можно выполнить:
-=== СПОСОБ 6 — с помощью lsof==-
Так же, можно выполнить:
-=== СПОСОБ 7 — с помощью ls и which==-
Вот и все. Если имеются другие примеры проверки инициализации, пишите в комментариях. Тема «Система инициализации в Unix/Linux» завершена.
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
Источник
Системы инициализации Unix и Linux после SysV
До середины 2000-х никому в голову не приходило менять sysvinit, почти никому. Gentoo с самого начала создавала и развивала OpenRC. Все изменилось с появлением launchd в Mac OS X. Разработчики Ubuntu бросились создавать Upstart, в котором были позаимствованы некоторые идеи из launchd . Дело шло ни шатко ни валко, но тут случился systemd и смешал все карты. Но кто же был истинным первопроходцем?
Daniel J. Bernstein математик и специалист по криптографии, автор популярного MTA qmail и множества других менее известных программ, среди которых выделяется daemontools. Для множества современных систем инициализации daemontools являлся примером и вдохновителем. Прошу внутрь для того, чтобы познакомиться с самой элегантной, простой и влиятельной системой управления службами в Unix / Linux.
DJB и Daemontools
Уравнения Максвелла для управления процессами на Unix ОС.
Внимание — не следует путать daemontools написанный DJB с программой-тезкой DAEMON Tools для монтирования iso образов и создания виртуальных CD/DVD дисков.
Daniel J. Bernstein создал свою программу в 1997 г. Последний стабильный релиз был в июле 2001 г.
Сейчас, когда в Linux сообществе наблюдается раскол из-за systemd, самое время вспомнить каким может быть настоящий инит в духе принципов и философии Unix. В этом смысле дзен-программист DJB является воплощением минимализма и простоты, а бритва Оккама у него встроена в клавиатуру. Его решения основательны и элегантны, на этом фундаменте он строит надежное, безопасное ПО, которое потребляет минимальное количество ресурсов ОС. Вот некоторые особенности его стиля работы.
- Самый большой файс исходного кода multilog.c имеет всего лишь 13898, нет не строк, а байтов. Команда wc указывает лишь на 617 строк кода.
- Большинство функций имеют меньше 30 строк.
- Принцип — никогда ничего не парсить.
- Принцип — использовать все, что дает ОС и не изобретать велосипеды.
Почему такие странные принципы, и еще с учетом того, что автор исповедует их фанатично? Строительный материал daemontools — директории, процессы, FIFO, исполняемые файлы. Это дает массу преимуществ в разработке и отладке приложения:
- Тестировать запуск службы проще простого — если запустится исполняемый файл ./run , то и служба тоже запустится.
- Можно использовать любой язык программирования, не только Bash. Сгодится даже скомпилированный бинарник.
- Понятно, что и как делает программа даже без подробного прочтения документации и изучения исходного кода.
- Парсить разнообразные текстовые структуры — на удивление трудная задача, если это делать по уму. Автор избегает этого, умело используя иерархическое свойство файловой системы Unix для воссоздания структуры переменных среды ключ=значение .
Сравнительная таблица DT
Стоит обратить внимание на неортодоксальную структуру директорий daemontools, ничтоже сумняшеся программа создает каталоги в корне файловой системы Unix. DJB прописал в коде программы директории /service , /command и рекомендует создать /package для исходников программы. Это считается весьма дурным тоном в Unix и Linux, создатели дистрибутивов всеми силами избегают этого, также как и пользователи с правами root.
features | inittab | ttys | init.d | rc.local | /service |
---|---|---|---|---|---|
Easy service installation and removal | No | No | Yes | No | Yes |
Easy first-time service startup | No | No | No | No | Yes |
Reliable restarts | Yes | Yes | No | No | Yes |
Easy, reliable signalling | No | No | No | No | Yes |
Clean process state | Yes | Yes | No | No | Yes |
Portability | No | No | No | No | Yes |
Давайте пробежимся по таблице самовосхваления daemontools. Начнем с первой строчки. Действительно создание и удаление нового сервиса проще простого, добавил, или удалил новую директорию в /service вместе с файлом ./run и на этом все. Сравните со скриптами sysvinit и остальных инитов, чтобы оценить простоту такого способа достичь того же самого.
Второй пункт менее убедителен в том смысле, что конечно же проще когда сервис и в первый раз стартует автоматически, но в остальных системах инициализации и управления службами достаточно одной команды для первого старта службы.
Возможность перезапустить завершившийся сервис в автоматическом режиме была на тот момент момент большим шагом вперед. На сегодняшний день это уже в порядке вещей.
Четвертая позиция — сигналы. Команда svc , как показано ниже, позволяет послать службе практически любой сигнал POSIX стандартов.
Последние две позиции кажутся несколько надуманными, не совсем понятно как daemontools восстанавливает состояние процесса в отличие от остальных инитов. Непонятно также, почему автор только свою программу считает переносимой на другие платформы.
Структура DT
По словам автора: daemontools — это набор инструментов для управления службами UNIX. Основными отличиями от традиционных инитов (структуры директорий rcX.d, rc.d, rc.local и пр.) является способность перезапустить сервис в случае его падения и наличие программы ведения и ротации логов — multilog. Также, multilog позволяет вести лог вывода программ, не умеющих перенаправлять вывод в syslog . Таким образом, можно запускать как сервис программы, для этого вовсе не предназначенные.
Внутреннее устройство daemontools, граница обведена красной прерывистой линией.
Теперь немного о принципах работы программы.
В самом начале системный инит запускает svscanboot , который затем запускает программу svscan в ново-созданной директории svscan . Далее svscanboot перенаправляет вывод запущенного svscan в отладочный процесс readproctitle .
Ядром daemontools являются всего две программы: svscan и supervise . Первая запускается с единственным аргументом по выбору, а вторая — с обязательным ключом.
Svscan служит для запуска и слежения за сервисами. Каждые 5 секунд Svscan проверяет каталог /service , если другой не задан, на наличие новых подкаталогов. Если такие будут обнаружены, запускается новая копия supervise для каждого каталога.
Supervise является, в соответствии с названием, контролирующем процессом. Он вызывается с параметром, в котором содержится имя каталога и в нем ищет скрипт ./run , который и запускает. Если по каким-то причинам ./run перестал исполняться, то тогда supervise его перезапустит после небольшой паузы — чтобы не создавать дополнительной нагрузки на ОС. Supervise не перезапустит ./run , если в каталоге будет обнаружен файл ./down . Supervise создает в каталоге сервиса подкаталог ./supervise , в котором хранятся данные о процессе. Эти данные могут быть прочитаны с помощью утилиты svstat . Для управления сервисом служит программа svc .
Синтаксис команды svc и опции представлены ниже.
- -u: Up, запустить сервис, в случае останова — перезапустить.
- -d: Down, остановить сервис.
- -t: Terminate, посылает сервису сигнал TERM.
- -k: Kill, посылает сервису сигнал KILL.
- -p: Pause, посылает сервису сигнал STOP.
- -c: Continue, посылает сервису сигнал CONT.
- -h: Hangup, посылает сервису сигнал HUP.
- -a: Alarm, посылает сервису сигнал ALRM.
- -h: Interrupt, посылает сервису сигнал INT.
- -x: Exit, supervise завершит работу как только ./run или его потомок завершится.
- -o: Once, запустить сервис, но не перезапускать после его завершения.
Есть еще одно обстоятельство, если в рабочем каталоге supervise содержится подкаталог ./log , в котором есть ./log/run , то тогда будет запущена еще одна копия supervise и создан канал между ./run и ./log/run .
Попробуем добавить сервис sshd.
В таком случае структура директорий может выглядеть так.
После того, как svscan пробежится по этому списку мы получим дерево процессов, в котором процессы service следят за сервисами и логированием.
Зависимости между службами
Несмотря на то, что программа не поддерживает зависимости между различными службами, есть способ добиться учета зависимостей, используя для этого svok следующим образом.
- svok — проверяет, запущена ли определенная служба. Ничего не выводит в stdout и stderr , если служба запущена, то тогда программа возвращает код 0, в противном случае — код 100.
В данном примере программа на python запустится только в том случае, если стартовал postgres, если же последний пока не поднялся, скрипт завершится и затем через определенно время svscan его перезапустит. Когда же postgres наконец поднимется, python запустит веб приложение.
Квотирование сервиса
С помощью утилиты softlimit можно ограничить предоставленные данному сервису ресурсы.
- softlimit — запускает программу с ресурсными ограничениями.
Логирование
Если у вас есть некая программа foo , которая не ведет логов, вы без труда сделаете это с помощью multilog , собрав в отдельном файле вывод stdout и stderr с временными метками.
Из другого терминала запускаем:
Последователи daemontools
Мало кто сегодня использует DT, но можно смело сказать, что Daniel J. Bernstein стал для многих примером, а дело его живет и здравствует. Вот неполный список его последователей.
- daemontools-encore — Разработчик Bruce Guenter, является дальнейшим развитием DT. Не полноценный инит, также как и оригинал.
- runit — Разработчик Gerrit Pape, умеет параллельно запускать службы. Хабрапост.
- s6 — Полноценный асинхронный инит с PID 1.
- nosh — Легковесный гипервизор процессов для BSD и Linux, умеет параллельно запускать и останавливать службы.
Источник