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

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

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

USE_RC_SUBR=	doormand

  这些脚本必须放到 files 目录, 并附加 .in。 这个文件中可以使用标准的 SUB_LIST 替换展开。 除此之外, 我们还强烈推荐使用 %%PREFIX%%%%LOCALBASE%% 替换展开。 关于 SUB_LIST 的介绍可以在 本书的相关章节 找到。

  在 FreeBSD 6.1-RELEASE 之前, 与 rcorder(8) 的集成是通过 USE_RCORDER 而不是 USE_RC_SUBR 来完成的。 不过, 除非 port 需要提供安装进基本系统这样的选项, 或者服务需要在 rc.d 脚本 FILESYSTEMS 之前运行这类特殊情况, 一般来说是不需要使用这个功能的。

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

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

#!/bin/sh

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

. /etc/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"

  除非有很站得住脚的理由提前启动服务,所有的 ports 脚本应使用

REQUIRE: LOGIN
。 如果服务需要以特定用户 (除 root 之外) 身份启动, 则必须这样做。 在前面的例子中, 我们还使用了
KEYWORD: shutdown
以便让 mythical port 在系统停机的过程中以正常的方式终止, 因为它需要在系统引导过程中启动服务。 如果脚本没有启动任何服务, 则并不需要这样做。

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

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

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

6.23.1 卸载时停止服务

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

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

@stopdaemon doormand

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

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