diff options
Diffstat (limited to 'zh_CN.GB2312/articles/rc-scripting/article.xml')
-rw-r--r-- | zh_CN.GB2312/articles/rc-scripting/article.xml | 136 |
1 files changed, 64 insertions, 72 deletions
diff --git a/zh_CN.GB2312/articles/rc-scripting/article.xml b/zh_CN.GB2312/articles/rc-scripting/article.xml index 9a3e890f9d..5ceef353e2 100644 --- a/zh_CN.GB2312/articles/rc-scripting/article.xml +++ b/zh_CN.GB2312/articles/rc-scripting/article.xml @@ -1,27 +1,19 @@ <?xml version="1.0" encoding="gb2312"?> -<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V4.5-Based Extension//EN" - "../../../share/xml/freebsd45.dtd"> - +<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V5.0-Based Extension//EN" + "../../../share/xml/freebsd50.dtd"> <!-- The FreeBSD Documentation Project The FreeBSD Chinese (Simplified) Documentation Project Original Revision: 1.14 --> +<article xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:lang="zh_cn"> + <info><title>BSD rc.d脚本编程实战</title> + -<article lang='zh_cn'> - <articleinfo> - <title>BSD rc.d脚本编程实战</title> - - <author> - <firstname>Yar</firstname> - - <surname>Tikhiy</surname> - - <affiliation> + <author><personname><firstname>Yar</firstname><surname>Tikhiy</surname></personname><affiliation> <address><email>yar@FreeBSD.org</email></address> - </affiliation> - </author> + </affiliation></author> <copyright> <year>2005</year> @@ -35,7 +27,7 @@ <releaseinfo>$FreeBSD$</releaseinfo> - <legalnotice id="trademarks" role="trademarks"> + <legalnotice xml:id="trademarks" role="trademarks"> &tm-attrib.freebsd; &tm-attrib.netbsd; &tm-attrib.general; @@ -51,9 +43,9 @@ 这样的实验为大家进一步研究设计有效的 <filename>rc.d</filename> 应用程序提供了一些参考点。</para> </abstract> - </articleinfo> + </info> - <sect1 id="rcng-intro"> + <sect1 xml:id="rcng-intro"> <title>简介</title> <para>历史上 BSD 曾有过一个单一的启动脚本, @@ -147,7 +139,7 @@ 还保留了对脚本编写者都可见的类似观点。</para> </sect1> - <sect1 id="rcng-task"> + <sect1 xml:id="rcng-task"> <title>任务描述</title> <para>在开始打开 <envar>$EDITOR</envar>(编辑器) @@ -172,27 +164,27 @@ <para>从下面的例子中我们将看到,为什么说知道这些问题的答案是很重要的。</para> </sect1> - <sect1 id="rcng-dummy"> + <sect1 xml:id="rcng-dummy"> <title>虚拟的脚本</title> <para>下面的脚本是用来在每次系统启动时发出一个信息:</para> <informalexample> - <programlisting>#!/bin/sh<co id="rcng-dummy-shebang"/> + <programlisting>#!/bin/sh<co xml:id="rcng-dummy-shebang"/> -. /etc/rc.subr<co id="rcng-dummy-include"/> +. /etc/rc.subr<co xml:id="rcng-dummy-include"/> -name="dummy"<co id="rcng-dummy-name"/> -start_cmd="${name}_start"<co id="rcng-dummy-startcmd"/> -stop_cmd=":"<co id="rcng-dummy-stopcmd"/> +name="dummy"<co xml:id="rcng-dummy-name"/> +start_cmd="${name}_start"<co xml:id="rcng-dummy-startcmd"/> +stop_cmd=":"<co xml:id="rcng-dummy-stopcmd"/> -dummy_start()<co id="rcng-dummy-startfn"/> +dummy_start()<co xml:id="rcng-dummy-startfn"/> { echo "Nothing started." } -load_rc_config $name<co id="rcng-dummy-loadconfig"/> -run_rc_command "$1"<co id="rcng-dummy-runcommand"/></programlisting> +load_rc_config $name<co xml:id="rcng-dummy-loadconfig"/> +run_rc_command "$1"<co xml:id="rcng-dummy-runcommand"/></programlisting> </informalexample> <para>需要注意的是:</para> @@ -256,7 +248,7 @@ run_rc_command "$1"<co id="rcng-dummy-runcommand"/></programlisting> </callout> <callout arearefs="rcng-dummy-name"> - <para><anchor id="name-var"/>强制的变量 + <para><anchor xml:id="name-var"/>强制的变量 <envar>name</envar> 指定我们脚本的名字。 这是 &man.rc.subr.8; 所强调的。也就是, 每个 <filename>rc.d</filename> 脚本在调用 @@ -331,7 +323,7 @@ run_rc_command "$1"<co id="rcng-dummy-runcommand"/></programlisting> </calloutlist> </sect1> - <sect1 id="rcng-confdummy"> + <sect1 xml:id="rcng-confdummy"> <title>可配置的虚拟脚本</title> <para>现在我们来给我们的虚拟脚本增加一些控制参数吧。正如你所知, @@ -350,18 +342,18 @@ run_rc_command "$1"<co id="rcng-dummy-runcommand"/></programlisting> . /etc/rc.subr name=dummy -rcvar=dummy_enable<co id="rcng-confdummy-rcvar"/> +rcvar=dummy_enable<co xml:id="rcng-confdummy-rcvar"/> start_cmd="${name}_start" stop_cmd=":" -load_rc_config $name<co id="rcng-confdummy-loadconfig"/> -eval "${rcvar}=\${${rcvar}:-'NO'}"<co id="rcng-confdummy-enable"/> -dummy_msg=${dummy_msg:-"Nothing started."}<co id="rcng-confdummy-opt"/> +load_rc_config $name<co xml:id="rcng-confdummy-loadconfig"/> +eval "${rcvar}=\${${rcvar}:-'NO'}"<co xml:id="rcng-confdummy-enable"/> +dummy_msg=${dummy_msg:-"Nothing started."}<co xml:id="rcng-confdummy-opt"/> dummy_start() { - echo "$dummy_msg"<co id="rcng-confdummy-msg"/> + echo "$dummy_msg"<co xml:id="rcng-confdummy-msg"/> } run_rc_command "$1"</programlisting> @@ -460,7 +452,7 @@ run_rc_command "$1"</programlisting> </calloutlist> </sect1> - <sect1 id="rcng-daemon"> + <sect1 xml:id="rcng-daemon"> <title>启动并停止简单守护进程</title> <para>我们早先说过 &man.rc.subr.8; 是能够提供默认方法的。 @@ -478,7 +470,7 @@ run_rc_command "$1"</programlisting> name=mumbled rcvar=mumbled_enable -command="/usr/sbin/${name}"<co id="rcng-daemon-basic-cmd"/> +command="/usr/sbin/${name}"<co xml:id="rcng-daemon-basic-cmd"/> load_rc_config $name run_rc_command "$1"</programlisting> @@ -546,7 +538,7 @@ run_rc_command "$1"</programlisting> </calloutlist> </sect1> - <sect1 id="rcng-daemon-adv"> + <sect1 xml:id="rcng-daemon-adv"> <title>启动并停止高级守护进程</title> <para>我们来给之前的 <quote>骨架</quote> @@ -564,26 +556,26 @@ name=mumbled rcvar=mumbled_enable command="/usr/sbin/${name}" -command_args="mock arguments > /dev/null 2>&1"<co id="rcng-daemon-adv-args"/> +command_args="mock arguments > /dev/null 2>&1"<co xml:id="rcng-daemon-adv-args"/> -pidfile="/var/run/${name}.pid"<co id="rcng-daemon-adv-pid"/> +pidfile="/var/run/${name}.pid"<co xml:id="rcng-daemon-adv-pid"/> -required_files="/etc/${name}.conf /usr/share/misc/${name}.rules"<co id="rcng-daemon-adv-reqfiles"/> +required_files="/etc/${name}.conf /usr/share/misc/${name}.rules"<co xml:id="rcng-daemon-adv-reqfiles"/> -sig_reload="USR1"<co id="rcng-daemon-adv-sig"/> +sig_reload="USR1"<co xml:id="rcng-daemon-adv-sig"/> -start_precmd="${name}_prestart"<co id="rcng-daemon-adv-precmd"/> -stop_postcmd="echo Bye-bye"<co id="rcng-daemon-adv-postcmd"/> +start_precmd="${name}_prestart"<co xml:id="rcng-daemon-adv-precmd"/> +stop_postcmd="echo Bye-bye"<co xml:id="rcng-daemon-adv-postcmd"/> -extra_commands="reload plugh xyzzy"<co id="rcng-daemon-adv-extra"/> +extra_commands="reload plugh xyzzy"<co xml:id="rcng-daemon-adv-extra"/> -plugh_cmd="mumbled_plugh"<co id="rcng-daemon-adv-methods"/> +plugh_cmd="mumbled_plugh"<co xml:id="rcng-daemon-adv-methods"/> xyzzy_cmd="echo 'Nothing happens.'" mumbled_prestart() { - if checkyesno mumbled_smart; then<co id="rcng-daemon-adv-yn"/> - rc_flags="-o smart ${rc_flags}"<co id="rcng-daemon-adv-rcflags"/> + if checkyesno mumbled_smart; then<co xml:id="rcng-daemon-adv-yn"/> + rc_flags="-o smart ${rc_flags}"<co xml:id="rcng-daemon-adv-rcflags"/> fi case "$mumbled_mode" in foo) @@ -593,15 +585,15 @@ mumbled_prestart() rc_flags="-baz ${rc_flags}" ;; *) - warn "Invalid value for mumbled_mode"<co id="rcng-daemon-adv-warn"/> - return 1<co id="rcng-daemon-adv-preret"/> + warn "Invalid value for mumbled_mode"<co xml:id="rcng-daemon-adv-warn"/> + return 1<co xml:id="rcng-daemon-adv-preret"/> ;; esac - run_rc_command xyzzy<co id="rcng-daemon-adv-run"/> + run_rc_command xyzzy<co xml:id="rcng-daemon-adv-run"/> return 0 } -mumbled_plugh()<co id="rcng-daemon-adv-plugh"/> +mumbled_plugh()<co xml:id="rcng-daemon-adv-plugh"/> { echo 'A hollow voice says "plugh".' } @@ -830,7 +822,7 @@ fi</programlisting> </calloutlist> </sect1> - <sect1 id="rcng-hookup"> + <sect1 xml:id="rcng-hookup"> <title>链接脚本到 rc.d 框架</title> <para>当编写好了一个脚本,它需要被整合到 <filename>rc.d</filename> 中去。 @@ -841,8 +833,8 @@ fi</programlisting> 通常你不必担心适当的所有权限和模式。系统脚本应当是通过可以在 <filename>src/etc/rc.d</filename> 找到的 <filename>Makefile</filename> 安装的。Port 脚本可以像 - <ulink url="&url.books.porters-handbook;/rc-scripts.html">Porter's Handbook</ulink> - 中描述那样通过使用 <makevar>USE_RC_SUBR</makevar> 来被安装。</para> + <link xlink:href="&url.books.porters-handbook;/rc-scripts.html">Porter's Handbook</link> + 中描述那样通过使用 <varname>USE_RC_SUBR</varname> 来被安装。</para> <para>不过,我们应该预先考虑到我们脚本在系统启动顺序中的位置。 我们的脚本所处理的服务可能依赖于其它的服务。举个例子, @@ -893,10 +885,10 @@ fi</programlisting> <informalexample> <programlisting>#!/bin/sh -# PROVIDE: mumbled oldmumble <co id="rcng-hookup-provide"/> -# REQUIRE: DAEMON cleanvar frotz<co id="rcng-hookup-require"/> -# BEFORE: LOGIN<co id="rcng-hookup-before"/> -# KEYWORD: nojail shutdown<co id="rcng-hookup-keyword"/> +# PROVIDE: mumbled oldmumble <co xml:id="rcng-hookup-provide"/> +# REQUIRE: DAEMON cleanvar frotz<co xml:id="rcng-hookup-require"/> +# BEFORE: LOGIN<co xml:id="rcng-hookup-before"/> +# KEYWORD: nojail shutdown<co xml:id="rcng-hookup-keyword"/> . /etc/rc.subr @@ -909,8 +901,8 @@ start_precmd="${name}_prestart" mumbled_prestart() { if ! checkyesno frotz_enable && \ - ! /etc/rc.d/frotz forcestatus 1>/dev/null 2>&1; then - force_depend frotz || return 1<co id="rcng-hookup-force"/> + ! /etc/rc.d/frotz forcestatus 1>/dev/null 2>&1; then + force_depend frotz || return 1<co xml:id="rcng-hookup-force"/> fi return 0 } @@ -956,7 +948,7 @@ run_rc_command "$1"</programlisting> <para>除了条件相对应的每个单独服务,脚本使用元条件和它们的 <quote>占位符</quote> 来保证某个操作组在其它之前被执行。 - 这些是由 <filename><replaceable>UPPERCASE</replaceable></filename> + 这些是由 <filename>UPPERCASE</filename> 大写名字所表示的。它们的列表和用法可以在 &man.rc.8; 中找到。</para> <para>切记将一个服务名称放进 <literal>REQUIRE:</literal> @@ -971,7 +963,7 @@ run_rc_command "$1"</programlisting> </callout> <callout arearefs="rcng-hookup-keyword"> - <para><anchor id="keywords"/>如我们从上述文字所记起的,&man.rcorder.8; + <para><anchor xml:id="keywords"/>如我们从上述文字所记起的,&man.rcorder.8; 关键字可以用来选择或省略某些脚本。即任何 &man.rcorder.8; 用户可以通过指定 <option>-k</option> 和 <option>-s</option> 选项来分别指定 <quote>保留清单(keep list)</quote> 和 @@ -1046,7 +1038,7 @@ run_rc_command "$1"</programlisting> </callout> <callout arearefs="rcng-hookup-force"> - <para><anchor id="forcedep"/>以 + <para><anchor xml:id="forcedep"/>以 <function>force_depend</function> 起始的行应被用于更谨慎的情况。通常,用于修正相互关联的 <filename>rc.d</filename> @@ -1068,7 +1060,7 @@ run_rc_command "$1"</programlisting> </calloutlist> </sect1> - <sect1 id="rcng-args"> + <sect1 xml:id="rcng-args"> <title>给予 rc.d 脚本更多的灵活性</title> <para>当进行启动或停止的调用时,<filename>rc.d</filename> @@ -1119,7 +1111,7 @@ extra_commands="kiss" dummy_start() { - if [ $# -gt 0 ]; then<co id="rcng-args-start"/> + if [ $# -gt 0 ]; then<co xml:id="rcng-args-start"/> echo "Greeting message: $*" else echo "Nothing started." @@ -1129,7 +1121,7 @@ dummy_start() dummy_kiss() { echo -n "A ghost gives you a kiss" - if [ $# -gt 0 ]; then<co id="rcng-args-kiss"/> + if [ $# -gt 0 ]; then<co xml:id="rcng-args-kiss"/> echo -n " and whispers: $*" fi case "$*" in @@ -1143,7 +1135,7 @@ dummy_kiss() } load_rc_config $name -run_rc_command "$@"<co id="rcng-args-all"/></programlisting> +run_rc_command "$@"<co xml:id="rcng-args-all"/></programlisting> </informalexample> <para>能注意到脚本里发生了那些实质性改变么?</para> @@ -1200,17 +1192,17 @@ A ghost gives you a kiss and whispers: Once I was Etaoin Shrdlu...</screen> </calloutlist> </sect1> - <sect1 id="rcng-furthur"> + <sect1 xml:id="rcng-furthur"> <title>进一步阅读</title> - <para><anchor id="lukem"/><ulink url="http://www.mewburn.net/luke/papers/rc.d.pdf"> - Luke Mewburn 的原始文章</ulink> 中讲述了 + <para><anchor xml:id="lukem"/><link xlink:href="http://www.mewburn.net/luke/papers/rc.d.pdf"> + Luke Mewburn 的原始文章</link> 中讲述了 <filename>rc.d</filename> 的基本概要, 并详细阐述了其设计方案的原理。该文章提供了深入了解整个 <filename>rc.d</filename> 框架以及其所在的现代 BSD 操作系统的内容。</para> - <para><anchor id="manpages"/>在 &man.rc.8;,&man.rc.subr.8;, + <para><anchor xml:id="manpages"/>在 &man.rc.8;,&man.rc.subr.8;, 还有 &man.rcorder.8; 的联机手册中,对 <filename>rc.d</filename> 组件做了非常详细的记载。 在你写脚本时,如果不去学习和参考这些联机手册的话, |