sysscripts.html
来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 335 行
HTML
335 行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>分析一个系统脚本</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="系统与管理命令"HREF="system.html"><LINKREL="PREVIOUS"TITLE="系统与管理命令"HREF="system.html"><LINKREL="NEXT"TITLE="命令替换"HREF="commandsub.html"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="system.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">13. 系统与管理命令</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="commandsub.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="SYSSCRIPTS">13.1. 分析一个系统脚本</A></H1><P><ANAME="KILLALL2REF"></A></P><P>利用我们所学到的关于管理命令的知识, 让我们一起来练习分析一个系统脚本. 最简单并且最短的系统脚本之一是<SPANCLASS="QUOTE">"killall"</SPAN>, <ANAME="AEN13054"HREF="#FTN.AEN13054"><SPANCLASS="footnote">[1]</SPAN></A> 这个脚本被用来在系统关机时挂起运行的脚本. </P><DIVCLASS="EXAMPLE"><HR><ANAME="EX55"></A><P><B>例子 13-11. <BCLASS="COMMAND">killall</B>, 来自于<TTCLASS="FILENAME">/etc/rc.d/init.d</TT></B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 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</PRE></FONT></TD></TR></TABLE><HR></DIV><P>这个没有那么糟. 除了在变量匹配的地方玩了一点花样, 其它也没有别的材料了. </P><DIVCLASS="FORMALPARA"><P><B>练习1. </B>在<TTCLASS="FILENAME">/etc/rc.d/init.d</TT>中, 分析<BCLASS="COMMAND">halt</B>脚本. 比脚本<BCLASS="COMMAND">killall</B>长一些, 但是概念上很相近. 对这个脚本做一个拷贝, 放到你的home目录下并且用它练习一下, (<EM>不</EM>要以root身份运行它). 使用<CODECLASS="OPTION">-vn</CODE>标志来模拟运行一下(<KBDCLASS="USERINPUT">sh -vn scriptname</KBD>). 添加详细的注释. 将<SPANCLASS="QUOTE">"action"</SPAN>命令修改为<SPANCLASS="QUOTE">"echo"</SPAN>. </P></DIV><DIVCLASS="FORMALPARA"><P><B>练习2. </B>察看<TTCLASS="FILENAME">/etc/rc.d/init.d</TT>下的更多更复杂的脚本. 看看你是不是能够理解其中的一些脚本. 使用上边的过程来分析这些脚本. 为了更详细的理解, 你可能也需要分析在<TTCLASS="FILENAME">/usr/share/doc/initscripts-?.??</TT>目录下的文件<TTCLASS="FILENAME">sysvinitfiles</TT>, 这些都是<SPANCLASS="QUOTE">"initscripts"</SPAN>文档的一部分. </P></DIV></DIV><H3CLASS="FOOTNOTES">注意事项</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN13054"HREF="sysscripts.html#AEN13054"><SPANCLASS="footnote">[1]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>系统的<ICLASS="FIRSTTERM">killall</I>脚本不应该与<TTCLASS="FILENAME">/usr/bin</TT>中的<AHREF="x6756.html#KILLALLREF">killall</A>命令相混淆. </P></TD></TR></TABLE><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="system.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首页</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="commandsub.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">系统与管理命令</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="system.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">命令替换</TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?