对于某些服务(例如:蓝牙),我在/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,就开始使用本机systemd
unity 文件和systemctl
命令,以避免涉及不必要的兼容层。