如何负责显示`正在启动... [ ok ]`

如何负责显示`正在启动... [ ok ]`

当我启动如下服务时:

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

当手动调用service/etc/init.d 或 /etc/rc.d 运行 SysV 样式脚本时,所有状态输出都取决于完全按照那个脚本。

正确编写的 init.d 脚本将使用发行版提供的 shell 函数库。例如,在 Debian 中,大多数脚本将加载(源)文件/lib/lsb/init-functions,并简单地调用其提供的函数,如下所示:

案例“$1”
  开始)
    守护进程信息“开始 $DESC” “$NAME”
    开始
    案例“$?”
        0|1)log_end_msg0;;
        2)log_end_msg 1;;
    埃萨克
    ;;
  [...]
埃萨克

这是标准功能列表由 LSB 定义。(请注意,发行版可能提供额外的功能超出标准,如上例。另请注意,例如 OpenRC 或 Arch Linux不是LSB 兼容并使用完全不同的风格。)

事实上,一些发行版也会集中提供此样板代码,init.d 脚本只需实现do_start。(请参阅 Gentoo 的 OpenRC 和 Debian 的/lib/init/init-d-script示例)。但是,这不是“标准” LSB 功能 - 试图兼容 LSB 的脚本仍必须手动执行此操作。


笔记:我强调“正确书写”,因为实际上没有什么可以力量一个 init.d 脚本来使用这些函数,而不是人工监督。如果脚本想要通过 plain echo(或 via cowsay)报告状态,它总是能够做到这一点。这对于在正常渠道之外分发的商业软件来说尤其成问题:它们的状态输出绝不看起来非常正确(并且坦白地说,整个 init.d 脚本的行为从来就不是很正确)。


同时,当在引导过程,结果甚至更加依赖于发行版——有时您会直接从脚本本身看到输出,但有时“主”init 系统会为其启动的所有服务提供自己的状态输出。(例子:Arch Linux 的旧启动脚本,在后台启动服务时。)

但你的第二个例子实际上是不是SysV 样式的 init – 它是 systemd(在您的示例中,它恰好启动了“旧”的 init.d 脚本)。Systemd 是一个使用服务配置(而非脚本)的全服务管理器,因此全部启动/关闭状态输出由 systemd 本身提供。这也适用于大多数其他“服务管理器”,包括 init-ng、SMF 或 Upstart。

答案2

这来自发行版相关的初始化脚本。检查service程序内容,这可能是一些调用底层管理脚本(SysV 现已过时)或二进制文件(systemd 是可行的方法)的 shell 脚本。这是 systemd 的优点之一 - 您不会得到“那取决于”的答案。

相关内容