Как ответственен за отображение `Starting ... [ok]`

339
nowox

Когда я запускаю такой сервис, как:

root@foo [~]# service foobar stop Stopping Foobar: [ OK ] 

Я вижу индикатор состояния: [ OK ]он отличается от того, который виден на /var/log/boot.log:

[ OK ] Started LSB: disk temperature monitoring daemon. ... 

Или даже отличается от:

* /proc is already mounted * Caching service dependencies ... [ ok ] 

В этих трех примерах какой процесс отвечает за отображение и запуск демонов? Иначе говоря, какая библиотека используется для отображения [ OK ], [FAILED]?

1

2 ответа на вопрос

3
grawity

Когда при ручном вызове serviceзапускается сценарий в стиле SysV из /etc/init.d или /etc/rc.d, весь вывод состояния полностью зависит от этого сценария.

Правильно написанные скрипты init.d будут использовать библиотеку функций оболочки, предоставляемых дистрибутивом. Например, в Debian большинство сценариев будут загружать (исходить) файл /lib/lsb/init-functionsи просто вызывать предоставленные им функции следующим образом:

дело "1 доллар" в Начните) log_daemon_msg "Запуск $ DESC" "$ NAME" do_start дело "$?" в 0 | 1) log_end_msg 0 ;; 2) log_end_msg 1 ;; ESAC ;; [...] ESAC 

Вот список стандартных функций, определенных LSB. (Обратите внимание, что дистрибутивы могут предоставлять дополнительные функции помимо стандарта, как в примере выше. Также обратите внимание, что, например, OpenRC или Arch Linux не совместимы с LSB и используют совершенно другие стили.)

Фактически, некоторые дистрибутивы также предоставляют этот стандартный код централизованно, и все, что осталось от сценария init.d - это реализовать do_start. (См. /lib/init/init-d-scriptПримеры в Gentoo OpenRC и Debian ). Однако это не «стандартная» функция LSB - сценарии, пытающиеся быть совместимыми с LSB, все равно должны делать это вручную.


Примечание: я подчеркиваю «Правильно написано», потому что на самом деле нет ничего, что заставило бы скрипт init.d использовать эти функции, кроме человеческого контроля. Если сценарий хочет сообщить о состоянии через обычный echo(или через него cowsay), он всегда может это сделать. Это особенно проблема с коммерческим программным обеспечением, распространяемым за пределами обычных каналов: вывод его состояния никогда не выглядит совершенно правильным (и, честно говоря, весь сценарий init.d никогда не ведет себя совершенно правильно).


Между тем, когда SysV-скрипты вызываются во время процесса загрузки, результат становится еще более зависимым от дистрибутива - иногда вы видите выходные данные непосредственно из самих сценариев, но иногда «основная» система инициализации предоставляет свой собственный вывод состояния для всех сервисов. это начинается. ( Пример: Arch старые Linux-скрипты при запуске службы в фоновом режиме.)

Но ваш второй пример на самом деле не инициализация в стиле SysV - это systemd (в вашем примере это просто запуск «устаревшего» скрипта init.d). Systemd - это полноценный менеджер сервисов, который использует конфигурации сервисов (не скрипты), и поэтому весь вывод состояния загрузки / выключения обеспечивается самим systemd. Это также относится к большинству других «менеджеров сервисов», включая init-ng, SMF или Upstart.

Я быстро взглянул на `/ lib / lsb / init-functions`, но когда я пытаюсь выполнить` [1! = 2] && log_end_msg 1`, я получаю `... fail!` Not `[fail]`. Я немного смущен. nowox 6 лет назад 0
@nowox: Вы, вероятно, хотите `log_failure_msg` тогда. (Сценарии init.d не очень согласуются в том, какие функции они используют. Моя система sid Debian имеет сочетание нескольких разных стилей.) grawity 6 лет назад 0
@nowox: Действительно, [фактическая спецификация LSB] (http://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/iniscrptfunc.html) определяет `log_success_msg` и` log_failure_msg` для этой цели. (Хотя, конечно, многие дистрибутивы использовали _non_-LSB-совместимые сценарии ...) grawity 6 лет назад 1
0
Tomasz Pala

Это происходит из дистрибутивно-зависимых скриптов инициализации. Проверьте содержимое serviceпрограммы, это, вероятно, какой-то сценарий оболочки, вызывающий базовые сценарии управления (SysV сейчас считаются устаревшими) или двоичные файлы (способ systemd). Это один из плюсов systemd - вы не получите ответов «это зависит».

... потому что `systemctl start` не имеет никакой обратной связи. grawity 6 лет назад 0
... и похоже, что `systemctl` опирается на` start-stop-daemon`. nowox 6 лет назад 0
Нет, systemctl не полагается на start-stop-daemon, если только вы не используете дистрибутив braindead. Tomasz Pala 6 лет назад 0
Нет, это не так. (Единственный раз, когда systemd запускает start-stop-daemon, это когда _s_ не существует нативный файл systemd .service и когда он вынужден вызывать старый скрипт /etc/init.d - _those_ использовать start-stop-daemon, если написано правильно .) grawity 6 лет назад 0
@grawity - да, выходных данных нет, поскольку сообщение `[OK]` было не чем иным, как ложью, потому что это был только статус какого-то запуска на первом этапе, до разветвления и деамонизации. Очень часто Деймон умер через несколько секунд после этого. Единственным надежным сообщением было `[FAILED]`, что иногда означало только, что служба ... уже запущена, но команда `service` этого не знала. Tomasz Pala 6 лет назад 1
Или, иногда, [ничего из вышеперечисленного] (https://i.imgur.com/xj9nWKx.png) grawity 6 лет назад 1
Приятно знать, что :( nowox 6 лет назад 0

Похожие вопросы