之路 on it Road.com

启动时的顺序依赖

让脚本以正确的顺序启动和停止很重要。
例如,为了使 NFS 和 NIS 正常工作,必须首先启动 RPC 端口映射程序守护进程 rpcbind。

rc脚本

当 init 进入一个运行级别时,它调用带有指定运行级别的数字参数的 rc 脚本。
rc 然后根据需要启动和停止系统上的服务,以使系统达到该运行级别。
尽管通常在启动时调用,但 rc 脚本可以由 init 调用以更改运行级别。
例如,以下可用于将系统更改为运行级别 3:

# init 3

当更改为运行级别 3 时,rc 通过停止所有不应在运行级别 3 中运行的服务并启动所有在运行级别 3 中运行但尚未运行的服务,将系统带入新的运行级别。

我们将在 /etc/rc.d 中找到所有系统初始化脚本。
这个子目录有更多子目录,每个运行级别一个: rc0.d-rc6.d 和 init.d 。
在 /etc/rc.d/rc#.d 子目录中(其中 # 由一位数代替)是指向存储在 /etc/rc.d/init.d 中的主脚本的符号链接。

# ls -lrt /etc/rc.d
total 60
-rwxr-xr-x  1 root root   889 Jan 29  2015 rc.local
-rwxr-xr-x  1 root root 20199 Oct  4  2017 rc.sysinit
-rwxr-xr-x  1 root root  2617 Oct  4  2017 rc
drwxr-xr-x. 2 root root  4096 Mar 20 16:49 init.d
drwxr-xr-x. 2 root root  4096 Mar 20 16:49 rc1.d
drwxr-xr-x. 2 root root  4096 Mar 20 16:49 rc0.d
drwxr-xr-x. 2 root root  4096 Mar 20 16:49 rc6.d
drwxr-xr-x. 2 root root  4096 Mar 20 16:54 rc4.d
drwxr-xr-x. 2 root root  4096 Mar 20 16:54 rc3.d
drwxr-xr-x. 2 root root  4096 Mar 20 16:54 rc2.d
drwxr-xr-x. 2 root root  4096 Mar 20 16:54 rc5.d

init.d 中的脚本采用 start 或者 stop 参数,偶尔还有 reload 或者 restart 参数。

Runlevel的实现

运行级别(Runlevel)作为系统上的目录实现,其中包含用于启动和停止特定守护程序的 shell 脚本,例如/etc/rc1.d/。
大多数系统都有运行级别 0-6 的目录。

每个目录中的脚本以大写 S 或者大写 K 命名,后跟两位数字,后跟所引用服务的名称。
以大写 S 开头的文件表示进入该运行级别时启动的脚本,而以大写 K 开头的文件表示停止的脚本。
数字指定脚本的执行顺序。

例如,一个守护进程可能在 rc3.d/ 中有一个名为 S35daemon 的脚本,在 rc2.d/ 中有一个名为 K65daemon 的脚本来停止它。
将数字放在文件名的开头会使它们按照所需的顺序进行排序和处理。

Upstart 和 SysV 运行级别兼容性

由于 Upstart 没有任何运行级别的内部概念,对它们的支持由 /etc/init/rc.conf 文件定义。
这种支持的存在是为了为单一 Unix 规范和以前的 SysV Init 实现提供向后兼容性。

/etc/rc

当 /etc/rc 程序被 init 调用以更改运行级别时,它会转到目标运行级别的目录并处理所有 K##script 文件以停止当前运行的不应该在目标运行级别中的服务和 S##script 文件,用于应该在目标运行级别中运行但当前未在目标运行级别中运行的服务。

由于 /etc/rc 程序在 Linux 上的工作方式,各个 /etc/rc#.d/ 目录对于每个服务将只有 S##script 或者 K##script 符号链接。
七个 /etc/rc#.d/ 目录中的每一个目录中的每个服务也将有一个符号链接。
除了 S99local 文件(指向 ../rc.local 的符号链接),它只出现在 /etc/rc1.d/ 到 /etc/rc5.d/ 中并且没有相应的终止符号链接,应该总是相同的每个运行级别目录中的文件数。

Linux 中的 rc 脚本

/etc/rc.local

可以在 /etc/init.d/ 目录中创建用于在系统上执行任务的自定义脚本,然后可以在 /etc/rc#.d/ 目录中创建指向这些脚本的符号链接以启动或者停止脚本必要的。
然而,对于某些任务来说,创建完整的 System V 风格的初始化脚本,包括启动和停止选项,是多余的。
例如,有些任务需要在系统启动时执行一次,但永远不需要被杀死,或者不需要每次系统更改运行级别时都运行,或者由于其他原因不完全适合从System V 初始化脚本。

/etc/init.d/

为了避免脚本重复,rc#.d/ 目录中的文件实际上是指向位于 /etc/init.d/ 目录中的脚本文件的符号链接。
系统上安装的每个服务都会在此目录中安装一个脚本,可用于控制该服务。
这些脚本被编写为采用指定它们应该启动服务的启动选项和指定它们应该停止服务的停止选项。

日期:2020-09-17 00:14:40 来源:oir作者:oir