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 后缀。 未来, 仍然包含这一后缀的脚本将被批量改名。
可以在卸载的过程中自动地停止服务。 我们建议只有在绝对必要, 例如必须在删除文件之前停止服务这类的情况下才使用这一功能。 通常来说, 决定是否在卸载时停止服务是系统管理员需要考虑的事情。 另外要注意, 这个功能也会影响升级过程。
需要时可以在 pkg-plist 中加入:
@stopdaemon doormand
这里的参数必须与 USE_RC_SUBR 变量的内容匹配。