我目前正在研究 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
这意味着umountfs
,sendsigs
和halt
将与参数一起执行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 来调用。
这就是系统停止的原因。
这个话题非常广泛,我希望这个小解释足够清楚。