5 启动并停止简单守护进程

  我们早先说过 rc.subr(8) 是能够提供默认方法的。 显然,这些默认方法并不是太通用的。 它们都是适用于大多数情况下来启动和停止一个简单的守护进程况。 我们来假设现在需要为一个叫做 mumbled 的守护进程编写一个 rc.d脚本, 在这里:

#!/bin/sh

. /etc/rc.subr

name=mumbled
rcvar=mumbled_enable

command="/usr/sbin/${name}"(1)

load_rc_config $name
run_rc_command "$1"

  感到很简单吧,不是么?我们来检查下我们这个小脚本。 只需要注意下面的这些新知识点:

(1)
这个 command 变量对于 rc.subr(8) 来说是有意义的。当它被设置时, rc.subr(8) 将根据提供传统守护进程的情形而生效。 特别是,将为这些参数提供默认的方法: startstoprestartpoll, 以及 status

该守护进程将会由运行中的 $command 配合由 $mumbled_flags 所指定的命令行标帜来启动。 因此,对默认的 start 方法来说, 所有的输入数据在我们脚本变量集合中都可用。与 start 不同的是, 其他方法可能需要与进程启动相关的额外信息。举个例子, stop 必须知道进程的 PID 号来终结进程。 在目前的情况中,rc.subr(8) 将扫描全部进程的清单, 查找一个名字等同于 $procname 的进程。 后者是另一个对 rc.subr(8) 有意义的变量, 并且默认它的值跟 command 一样。 换而言之,当我们给 command 设置值后, procname 实际上也设置了同样的值。 这启动我们的脚本来杀死守护进程并检查它是否正在第一个位置运行。

注意: 某些程序实际上是可执行的脚本。 系统启动脚本的解释器以传递脚本名为命令行参数的形式来运行脚本。 然后被映射到进程列表中,这会使 rc.subr(8) 迷惑。因此,当 $command 是一个脚本的时,你应该额外地设置 command_interpreter 来让 rc.subr(8) 知晓进程的实际名字。

对每个 rc.d 脚本而言, 有一个可选的 rc.conf(5) 变量给 command 指示其优先级。 它的名字是下面这样的形式:${name}_programname 是我们 之前 讨论过的必须性变量。如,在这个案例中它应该命名为 emumbled_program。这其实是 rc.subr(8) 分配 ${name}_program 来改写 command 的。

当然,即使 command 未被设置, sh(1) 也将允许你从 rc.conf(5) 或自身来设置 ${name}_program。在那种情况下, ${name}_program 的特定属性丢失了, 并且它成为了一个能供你的脚本用于其自身目的的普通变量。 然而,单独使用 ${name}_program 是并不是我们所寄望的,因为同时使用它和 command 已成为了 rc.d 脚本编程的一个惯用的约定。

关于默认方法的更详细的信息,请参考 rc.subr(8)

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.