1

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

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]?

2 ответа2

3

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

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

case "$1" in
  start)
    log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
        0|1) log_end_msg 0 ;;
        2) log_end_msg 1 ;;
    esac
    ;;
  [...]
esac

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

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


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


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

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .