This is an archive of past FreeBSD releases; it's part of the FreeBSD Documentation Archive.

启动和停止服务 (rc 脚本)

6.19 启动和停止服务 (rc 脚本)

  rc.d 脚本在系统启动时用于启动服务, 并为管理员提供停止、 启动和重新启动某个服务的标准方法。 Ports 安装的脚本会集成到系统的 rc.d 框架中。 关于如何使用它的说明, 可以在 使用手册的 rc.d 章节 找到。 关于可用命令的详细解释, 则可以在 rc(8)rc.subr(8) 找到。 最后, 您可以参阅 这篇文章 了解撰写 rc.d 脚本的最佳实践。

  可以安装一或多个 rc 脚本:

USE_RC_SUBR=   doormand

  这些脚本必须放到 files 目录, 并附加 .in。 与基本系统中的 rc.d 脚本不同, 这种脚本中 . /etc/rc.subr 行必须替换为 . %%RC_SUBR%%, 因为较早版本的 FreeBSD 中并不提供 /etc/rc.subr 文件。 此外, 这里还可以使用标准的 SUB_LIST 替换展开。 除此之外, 我们还强烈推荐使用 %%PREFIX%%%%LOCALBASE%%, 以及 %%X11BASE%% 这几个替换展开。 关于 SUB_LIST 的介绍可以在 本书的相关章节 找到。

  在 FreeBSD 6.1-RELEASE 之前, 与 rcorder(8) 的集成是通过 USE_RCORDER 而不是 USE_RC_SUBR 来完成的。 但是, 这种方法已经被淘汰。

  从 FreeBSD 6.1-RELEASE 开始, 本地安装的 rc.d 脚本 (包括由 port 安装的脚本) 会纳入基本系统的 rcorder(8)

  以下是一个简单的 rc.d 脚本:

#!/bin/sh

# PROVIDE: doormand
# REQUIRE: LOGIN
#
# 在 /etc/rc.conf.local 或 /etc/rc.conf 中增加下述设置可以启用这一服务:
#
# doormand_enable (bool):   默认设为 NO。
#               设为 YES 可以启用 doormand。
# doormand_config (path):   默认设为 %%PREFIX%%/etc/doormand/doormand.cf。
#

. %%RC_SUBR%%

name="doormand"
rcvar=${name}_enable

command=%%PREFIX%%/sbin/${name}
pidfile=/var/run/${name}.pid

load_rc_config $name

: ${doormand_enable="NO"}
: ${doormand_config="%%PREFIX%%/etc/doormand/doormand.cf"}

command_args="-p $pidfile -f $doormand_config"

run_rc_command "$1"

  这里, 对变量的默认赋值方法应采用 "=", 而非 ":=" 这样的形式。 这是因为, 前一种赋值方法只有在变量未被设置时才设置默认值, 而后一种方法则会在变量没有设置, 或者 其值为空时都设置默认值。 用户非常可能在其 rc.conf.local 中使用类似

doormand_flags=""
这样的设置, 而采用 ":=" 来进行赋值, 则会在不经意间覆盖用户所希望的设置。

  rc 脚本的后缀名, 会通过 RC_SUBR_SUFFIX 提供, 以便在 port 的 Makefile 中使用。 最新版本的 FreeBSD 并不为脚本名增加任何后缀, 但较早的版本则曾使用过 .sh 后缀。

注意: 新增的脚本均不应使用 .sh 后缀。 未来, 仍然包含这一后缀的脚本将被批量改名。

6.19.1 卸载时停止服务

  可以在卸载的过程中自动地停止服务。 我们建议只有在绝对必要, 例如必须在删除文件之前停止服务这类的情况下才使用这一功能。 通常来说, 决定是否在卸载时停止服务是系统管理员需要考虑的事情。 另外要注意, 这个功能也会影响升级过程。

  需要时可以在 pkg-plist 中加入:

@stopdaemon doormand

  这里的参数必须与 USE_RC_SUBR 变量的内容匹配。

若您有关于 FreeBSD ports 系统的问题, 请发送电子邮件至 <ports@FreeBSD.org>。
关于此文档的任何问题, 请致函 <doc@FreeBSD.org>。