aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/articles/rc-scripting/article.xml
diff options
context:
space:
mode:
Diffstat (limited to 'zh_CN.GB2312/articles/rc-scripting/article.xml')
-rw-r--r--zh_CN.GB2312/articles/rc-scripting/article.xml136
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 &gt; /dev/null 2&gt;&amp;1"<co id="rcng-daemon-adv-args"/>
+command_args="mock arguments &gt; /dev/null 2&gt;&amp;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 &amp;&amp; \
- ! /etc/rc.d/frotz forcestatus 1>/dev/null 2>&amp;1; then
- force_depend frotz || return 1<co id="rcng-hookup-force"/>
+ ! /etc/rc.d/frotz forcestatus 1&gt;/dev/null 2&gt;&amp;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> 组件做了非常详细的记载。
在你写脚本时,如果不去学习和参考这些联机手册的话,