当我启动如下服务时:
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 的优点之一 - 您不会得到“那取决于”的答案。