如何检查服务是否由 upstart 或 sysvinit 启动?

如何检查服务是否由 upstart 或 sysvinit 启动?

对于某些服务(例如:蓝牙),我在/etc/init.d//etc/init/目录中都有条目。

我如何知道此服务是如何启动的?通过sysvinit还是upstart

我正在使用 Ubuntu 14.04。

答案1

您可能有两组脚本,但只有一个活动的 init 系统。在 Ubuntu 14.04 上,那就是 Upstart。

因此,无论您的脚本是在 还是 下/etc/init.d/etc/init在 Ubuntu 14.04 下哪个 init 系统运行您的脚本的答案始终是 Upstart。

/etc/init.d您可以通过将strace系统调用记录到 STDOUT 来观察尝试运行脚本时发生的情况:

 sudo strace /etc/init.d/bluetooth start

首先,你会看到 init 脚本首先通过以下方式加载一些头文件函数:/lib/lsb/init-functions

open("/lib/lsb/init-functions", O_RDONLY) = 3

很快你就会看到活动转移到 Upstart 相关的脚本:

open("/lib/lsb/init-functions.d/01-upstart-lsb", O_RDONLY) = 3

这只是一个 shell 脚本,因此您可以打开它并阅读源代码来了解它的作用。

当您继续完成输出时,我认为您会看到命令被重定向为使用 Upstart 脚本而不是 SysV init 脚本来启动脚本。

有趣的是16.04之后,Upstart 进一步将控制权重定向到 systemd,并改为启动相关的 systemd 服务:

write(1, "Starting bluetooth (via systemct"..., 53Starting bluetooth (via systemctl): bluetooth.service) = 53

底线建议在 Ubuntu 14.04 上使用 Upstart 脚本和服务管理命令,以避免 SysV init 兼容层的复杂性和潜在混乱。同样,一旦升级到 16.04,就开始使用本机systemdunity 文件和systemctl命令,以避免涉及不必要的兼容层。

相关内容