利用我们所学到的关于管理命令的知识, 让我们一起来练习分析一个系统脚本. 最简单并且最短的系统脚本之一是"killall", [1] 这个脚本被用来在系统关机时挂起运行的脚本.
例子 13-11. killall, 来自于/etc/rc.d/init.d
1 #!/bin/sh
2
3 # --> 本书作者所做的注释全部以"# -->"开头.
4
5 # --> 这是由Miquel van Smoorenburg所编写的
6 # --> 'rc'脚本包的一部分, <miquels@drinkel.nl.mugnet.org>.
7
8 # --> 这个特殊的脚本看起来是Red Hat/FC专用的,
9 # --> (在其它的发行版中可能不会出现).
10
11 # 停止所有正在运行的不必要的服务
12 #+ (不会有多少, 所以这是个合理性检查)
13
14 for i in /var/lock/subsys/*; do
15 # --> 标准的for/in循环, 但是由于"do"在同一行上,
16 # --> 所以必须添加";".
17 # 检查脚本是否在那里.
18 [ ! -f $i ] && continue
19 # --> 这是一种使用"与列表"的聪明方法, 等价于:
20 # --> if [ ! -f "$i" ]; then continue
21
22 # 取得子系统的名字.
23 subsys=${i#/var/lock/subsys/}
24 # --> 匹配变量名, 在这里就是文件名.
25 # --> 与subsys=`basename $i`完全等价.
26
27 # --> 从锁定文件名中获得
28 # -->+ (如果那里有锁定文件的话,
29 # -->+ 那就证明进程正在运行).
30 # --> 参考一下上边所讲的"锁定文件"的内容.
31
32
33 # 终止子系统.
34 if [ -f /etc/rc.d/init.d/$subsys.init ]; then
35 /etc/rc.d/init.d/$subsys.init stop
36 else
37 /etc/rc.d/init.d/$subsys stop
38 # --> 挂起运行的作业和幽灵进程.
39 # --> 注意"stop"只是一个位置参数,
40 # -->+ 并不是shell内建命令.
41 fi
42 done |
这个没有那么糟. 除了在变量匹配的地方玩了一点花样, 其它也没有别的材料了.
练习1. 在/etc/rc.d/init.d中,
分析halt脚本.
比脚本killall长一些,
但是概念上很相近. 对这个脚本做一个拷贝,
放到你的home目录下并且用它练习一下,
(不要以root身份运行它).
使用-vn标志来模拟运行一下(sh -vn scriptname).
添加详细的注释. 将"action"命令修改为"echo".
练习2. 察看/etc/rc.d/init.d下的更多更复杂的脚本. 看看你是不是能够理解其中的一些脚本. 使用上边的过程来分析这些脚本. 为了更详细的理解, 你可能也需要分析在/usr/share/doc/initscripts-?.??目录下的文件sysvinitfiles, 这些都是"initscripts"文档的一部分.
| [1] | 系统的killall脚本不应该与/usr/bin中的killall命令相混淆. |