Когда ручной вызов 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.