首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SysV、Upstart和systemd init脚本共存

SysV、Upstart和systemd init脚本共存
EN

Ask Ubuntu用户
提问于 2017-01-04 09:00:13
回答 1查看 13.8K关注 0票数 17

例如,在我的系统(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吗?

请有人解释一下这种共存是如何工作的。

EN

回答 1

Ask Ubuntu用户

回答已采纳

发布于 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脚本在文件中开始读取:

代码语言:javascript
复制
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工具来管理服务。

票数 18
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/867843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档