例如,在我的系统(16.04)中,有文件/lib/systemd/system/network-manager.service和/etc/init.d/network-manager。
我不明白这是怎么回事(以及为什么)。我总是通过sudo service network-manager restart重新启动网络管理器。这难道不应该在某种程度上破坏系统吗?它似乎仍然有效。
为什么service --status-all列出各种服务?16.04不应该使用systemd而不是Upstart吗?
请有人解释一下这种共存是如何工作的。
发布于 2017-01-04 14:44:29
只有一个init系统可以一次活动。在16.04,这是系统d。
许多包附带了多个init系统的文件,因此可以在不同的OSes上使用多个init系统来管理它们。在Ubuntu上,有时会安装多个init系统的脚本,尽管它们并不是同时使用的。
较新的init系统试图保持与旧系统的兼容性。特别是,systemd试图保持与Upstart和SysV init脚本的兼容性。
在您提到的"init.d“脚本中,即"SysV”init脚本,而不是Upstart脚本。另外,"SysV“init脚本只有在被符号链接到"/etc/rc5.d”这样的目录时才会在引导时启动。您会发现Network在那里没有安装符号链接。
要了解systemd如何管理旧的"SysV“init脚本,请参阅系统如何使用/etc/init.d科学?。
现在,要回答关于为什么使用“服务网络管理器重新启动”重新启动网络管理器的问题。service命令用于Upstart脚本和SysV init脚本,更倾向于前者。Network还在/etc/init/network-manager.conf的16.04上安装了一个Upstart脚本。
如果您查看sudo strace service network-manager restart的输出,您可以了解正在发生的事情。首先,输出显示正在调用systemctl,指示命令被重定向到systemd。首先,在打开/usr/bin/service后不久,您可以看到它作为一个shell脚本在文件中开始读取:
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工具来管理服务。
https://askubuntu.com/questions/867843
复制相似问题