use*_*057 15 upstart services sysv systemd 16.04
例如,在我的系统 (16.04) 上,有文件/lib/systemd/system/network-manager.service和/etc/init.d/network-manager。
我不明白这是如何(以及为什么)工作的。我总是通过sudo service network-manager restart. 这不应该以某种方式弄乱 systemd 吗?它似乎仍然有效。
为什么要service --status-all列出各种服务?16.04 不应该使用 systemd 而不是 Upstart 吗?
有人请解释这种共存是如何工作的。
Mar*_*erg 17
一次只能激活一个初始化系统。在 16.04 上,这是 systemd。
许多软件包附带了多个 init 系统的文件,因此可以使用不同操作系统上的多个 init 系统来管理它们。在 Ubuntu 上,有时会安装多个 init 系统的脚本,即使它们不是同时使用的。
较新的 init 系统试图保持与旧系统的兼容性。特别是,systemd 试图保持与 Upstart 和 SysV init 脚本的兼容性。
对于您提到的“init.d”脚本,它是“SysV”初始化脚本,而不是 Upstart 脚本。此外,“SysV”初始化脚本只有在符号链接到“/etc/rc5.d”等目录时才会在引导时启动。您会发现网络管理器没有安装符号链接。
要了解如何systemd管理旧的“SysV”初始化脚本,请参阅systemd 如何使用 /etc/init.d scirpts?.
现在,回答关于为什么使用“service network-manager restart”重新启动网络管理器的问题。该service命令与 Upstart 脚本和 SysV init 脚本一起使用,更喜欢前者。网络管理器还在 16.04 上安装了一个 Upstart 脚本/etc/init/network-manager.conf。
如果您查看 的输出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
Run Code Online (Sandbox Code Playgroud)
现在我们知道这service是一个shell脚本,我们可以去查看它的源代码。在源代码中,我们发现is_systemd被检测和设置。对于 systemd 情况,您可以看到命令被重写为systemctl restart network-manager.
因此,虽然三个 init 系统共存并具有一定的兼容性,但存在复杂性。为了最大限度地减少未来发生的事情的复杂性,最好使用 systemd 单元文件和systemctl工具来管理服务。
| 归档时间: |
|
| 查看次数: |
13008 次 |
| 最近记录: |