13.1. 分析一个系统脚本

利用我们所学到的关于管理命令的知识, 让我们一起来练习分析一个系统脚本. 最简单并且最短的系统脚本之一是"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命令相混淆.