为什么在 debian init 期间某些脚本需要不断重新采购?

Ray*_*ews 6 debian sysvinit

研究 init 脚本后,我很困惑为什么需要一次又一次地重新获取某些辅助功能。特别是在/lib/lsb/init-functions. 每个需要日志消息的脚本都需要重新获取它的资源,为什么不能只做一次,仅此而已?

就好像每个新的 init 脚本都在它自己的 shell 中运行。如果是这样,为什么要那样做?同样的问题出现在“vars.sh”上,它需要一直重新获取资源。这是必要的吗?假设 'init-functions' 和 'vars.sh' 被添加到脚本列表中以在适当的运行级别中运行?

slm*_*slm 10

很多问题...

您的问题的基本答案是,是的,每个脚本都在自己的 shell 中运行,或者更确切地说,每个获得 exec 的进程都包含基本环境的副本 + 此采购包含的这些变量 + 包含的任何其他环境变量当服务启动时。

将这些包含,例如vars.sh,移动到运行级别将是一个坏主意,因为那样每个 shell 都会在该运行级别中拥有它们。这些脚本创建的大部分管道都非常特定于在生成的 shell 中运行的服务,这些服务是这些文件的副产品。

还请记住,很多内容都被缓冲和缓存,例如从磁盘读取的块,因此您不必每次都访问磁盘以随后重新读取这些文件。这是当您查看系统并发现它正在消耗大量 RAM 时所发生情况的一部分。

$ free -m
             total       used       free     shared    buffers     cached
Mem:          7782       7086        696          0        218        883
-/+ buffers/cache:       5984       1797
Swap:         7823       1550       6273
Run Code Online (Sandbox Code Playgroud)

-/+ buffers/cache行是缓存这些类型的块,与磁盘 I/O 相关。

未来发展方向

大部分 init 源自System V(有关完整历史,请参阅维基百科关于 init 的文章)。按照今天的标准,它已经过时了,但它已经使用了大约 20 年。但是肯定有不足的地方。

因此,为了尝试解决这些问题,已经开发了2 个新人SystemdUpstart,并开始被各种 Linux 发行版采用。

    党卫军#1

新贵的采用有点像过山车。它是由 Canonical 开发的,所以它在 Ubuntu 中已经有一段时间了,在他们切换到 systemd 之前,它曾经是 Fedora 以及 RHEL、CentOS 和 openSUSE 的一部分。在某种程度上,它实际上仍在 RHEL 和 CentOS 中。

这两个系统都对 SysV init 进行了显着改进,特别是在能够并行启动服务的领域。init 的主要缺陷之一。但是有了这些系统,打开几个脚本vim并调整启动例程的简单性已经一去不复返了。这些都是成熟的技术,需要时间来理解和完全理解。