Answers:
一次只能有一个init系统处于活动状态。在16.04,这是systemd。
许多软件包附带了用于多个init系统的文件,因此可以使用不同OS上的多个init系统来管理它们。在Ubuntu上,有时会安装多个init系统的脚本,即使不是同时使用它们也是如此。
较新的init系统会尝试与较旧的init系统保持兼容性。特别是,systemd尝试保持与Upstart和SysV初始化脚本的兼容性。
对于您提到的“ init.d”脚本,这是“ SysV”初始化脚本,而不是Upstart脚本。同样,“ SysV”初始化脚本只有在符号链接到“ /etc/rc5.d”之类的目录时,才会在引导时启动。您会发现Network Manager 那里没有安装符号链接。
要了解如何systemd
管理旧的“ SysV”初始化脚本,请参见systemd如何使用/etc/init.d脚本?。
现在,回答有关为什么它可以通过“ service network-manager restart”重新启动Network Manager的问题。该service
命令与Upstart脚本和SysV init脚本一起使用,最好使用前者。Network Manager在16.04处还安装了Upstart脚本/etc/init/network-manager.conf
。
如果查看的输出sudo strace service network-manager restart
,则可以了解发生了什么。首先,输出显示systemctl
正在被调用,表明该命令正被重定向到systemd。首先,在打开后不久/usr/bin/service
,您可以看到它开始以外壳程序脚本的形式在文件中读取:
open("/usr/sbin/service", O_RDONLY) = 3
...
read(10, "#!/bin/sh\n\n#####################"..., 8192) = 8192
现在我们知道这service
是一个shell脚本,我们可以检查它的源代码。在源代码中,我们发现is_systemd
已检测到并设置了该代码。对于systemd情况,您可以看到该命令被重写为systemctl restart network-manager
。
因此,虽然这三个init系统共存并具有一定的兼容性,但仍然存在一些复杂性。为了使将来发生的事情的复杂性最小化,最好使用systemd单位文件和该systemctl
工具来管理服务。