FreeBSD Porter 手册
上一页 | 第6章 　特殊情况 | 下一页

# 6.22 启动和停止服务 (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.22.1 卸载时停止服务

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

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

    @stopdaemon doormand

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

上一页 | 起始页 | 下一页
使用数据库 | 上一级 | 添加用户和用户组

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