关机期间哪些参数传递给 init 脚本

关机期间哪些参数传递给 init 脚本

我目前正在研究 ubunut precise pangolin 的启动和关闭过程。据我所知,在关闭时,系统切换到运行级别 0,并且所有带有 的脚本K*都使用参数执行stop,所有带有 的脚本S*都使用参数执行start

现在查看rc.0我可以看到以下脚本:

lrwxrwxrwx  1 root root   16  1. Jan 2000  K20dhcpcd -> ../init.d/dhcpcd
lrwxrwxrwx  1 root root   20  1. Jan 2000  S35networking -> ../init.d/networking
lrwxrwxrwx  1 root root   14  5. Apr 2013  S90halt -> ../init.d/halt
lrwxrwxrwx  1 root root   20  5. Apr 2013  S60umountroot -> ../init.d/umountroot
lrwxrwxrwx  1 root root   18  5. Apr 2013  S40umountfs -> ../init.d/umountfs
lrwxrwxrwx  1 root root   22  5. Apr 2013  S31umountnfs.sh -> ../init.d/umountnfs.sh
lrwxrwxrwx  1 root root   17  5. Apr 2013  S30urandom -> ../init.d/urandom
lrwxrwxrwx  1 root root   18  5. Apr 2013  S20sendsigs -> ../init.d/sendsigs
lrwxrwxrwx  1 root root   19 26. Aug 2013  K90syslog-ng -> ../init.d/syslog-ng

这意味着umountfssendsigshalt将与参数一起执行start

但是查看示例代码S90halt我发现以下内容:

case "$1" in
  start)
        # No-op
        ;;
  restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
  stop)
        do_stop
        ;;
  *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

即,当使用 调用时,此脚本不执行任何操作start,而只有使用 调用时,它才会真正停止系统stop。我找不到任何将此脚本作为终止脚本的引用,那么这种情况何时发生?

答案1

根据Ubuntu 新贵食谱

Ubuntu 目前采用混合系统,其中核心服务由 Upstart 处理,但其他服务可以在传统的 SystemV 模式下运行。这可能看起来很奇怪,但请考虑一下 Ubuntu 中通过 Universe 和 Multiverse 存储库提供的数千个软件包和数百个服务。为了避免必须更改每个软件包以与 Upstart 配合使用,Upstart 允许软件包使用其现有的 SystemV(因此与 Debian 兼容)脚本。

SystemV 使用运行级别来管理系统的启动、关闭和重启。

存在/etc/init.d处理服务停止/启动的脚本,/etc/init.d/skeleton每次运行级别改变时,系统都会遵循并执行这些脚本。

运行级别从 0 到 6 编号,/etc我们在rcX.d文件夹中找到了每个级别一个的文件夹。

在这些文件夹中,存在指向脚本的符号链接/etc/init.d,正如您所见,此链接的名称很特别:它们以年代或者(S 表示开始,K 表示终止)后跟数字和服务名称。

当系统命令改变运行级别的值时,rcX.d 目录中的脚本将被调用按字母顺序顺序:K 脚本带有停止参数,S 脚本带有启动参数。此规则不适用于两个运行级别 0(暂停)和 6(重新启动)。根据Debian 政策手册 第 9 章 - 操作系统

在这些运行级别中,带有 S 前缀的链接仍在带有 K 前缀的链接之后调用,但它们也使用单个参数 stop 来调用。

这就是系统停止的原因。

这个话题非常广泛,我希望这个小解释足够清楚。

相关内容