11.5. 启动服务

Contributed by Tom Rhodes.

许多用户会选择使用 Ports Collection 来在 FreeBSD 上安装第三方软件。 很多情况下这可能需要进行一些配置以便让这些软件能够在系统初始化的过程中启动。 服务, 例如 mail/postfixwww/apache13 就是这些需要在系统初始化时启动的软件包中的两个典型代表。 这一节解释了启动第三方软件所需要的步骤。

FreeBSD 包含的大多数服务,例如 cron(8), 就是通过系统启动脚本启动的。 这些脚本也许会有些不同, 这取决于 FreeBSD 版本。 但是不管怎样, 需要考虑的一个重要方面是他们的启动配置文件要能被基本启动脚本识别捕获。

在 rcNG 出现之前, 应用程序会把一个简单的启动脚本扔到 /usr/local/etc/rc.d 目录中, 这个目录中的脚本会被系统初始化脚本读取。

尽管很多人已经花费了相当多的时间来把旧的配置方式融入到新系统中, 仍然有许多第三方软件需要把脚本放到上面提到的目录中。 是否使用 rcNG 会对这些脚本的执行带来一些变化。 在 FreeBSD 5.1 之前采用的是旧式的配置, 当然, 绝大多数情况下, 新式的脚本也会工作的很好。

每个脚本都应该遵守 FreeBSD 版本所需求的一些规定: 每个脚本必须在文件名最后添加一个 .sh 的扩展名,并且这个脚本能被系统执行。 后者可以通过 chmod 命令把权限设置为 755来实现。 它还应该能接受 start 选项来启动程序并且接受 stop 选项来结束程序。

一个简单的脚本看起来可能会像这样:

#!/bin/sh
echo -n ' utility'

case "$1" in
start)
        /usr/local/bin/utility
        ;;
stop)
        kill -9 `cat /var/run/utility.pid`
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" >&2
        exit 64
        ;;
esac

exit 0

这个脚本提供了 stopstart 两个选项, 用以操作 utility

可以用如下方法来启动:

# /usr/local/etc/rc.d/utility.sh start

现在不是所有第三方软件都需要在 rc.conf有这么一行, 不过几乎每天都有port被修改来接受这个配置。 对于一个特定的应用程序来说, 你可以查看安装的最终输出来获得更多信息。 一些第三方软件仍然提供一个脚本来供 rcNG 来使用, 这将在下一节介绍。

11.5.1. 扩展应用程序配置

现在 FreeBSD 包含rcNG,软件启动配置更加理想了, 当然也变得更深奥。 用 rcNG 这章介绍的关键字,应用程序现在被配置为可以在某一个服务之后启动, 例如DNS; 可能还要在 rc.conf 传递更多的参数给启动脚本。 一个基本的脚本看起来有点象下面这个样子:

#!/bin/sh
#
# PROVIDE: utility
# REQUIRE: DAEMON
# BEFORE: LOGIN
# KEYWORD: FreeBSD shutdown

#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
# SET THEM IN THE /etc/rc.conf FILE
#
utility_enable=${utility_enable-"NO"}
utility_flags=${utility_flags-""}
utility_pidfile=${utility_pidfile-"/var/run/utility.pid"}

. /etc/rc.subr

name="utility"
rcvar=`set_rcvar`
command="/usr/local/sbin/utility"

load_rc_config $name

pidfile="${utility_pidfile}"

start_cmd="echo \"Starting ${name}.\"; /usr/bin/nice -5 ${command} ${utility_flags} ${command_args}"

run_rc_command "$1"

这个脚本将保证 utility 能够在 login 服务之前, 并在 daemon 服务之后启动。 它同时也提供了设置和跟踪 PID 的方法, 称作进程 ID 文件。

可以在 /etc/rc.conf 中加入:

utility_enable="YES"

这个新方法也使得命令行参数、包含 /etc/rc.subr 中所提供的功能, 兼容 rcorder(8) 工具并提供更简单的通过 rc.conf 文件来配置的方法。 实际上它甚至可以放到 /etc/rc.d 目录中。 当然, 在使用 mergemaster(8) 来完成软件升级时这会带来一些麻烦。

11.5.2. 用服务来启动服务

其他服务, 例如 POP3 服务器, IMAP, 等等, 也可以通过 inetd(8) 来启动。 这一过程包括从 Ports Collection 安装相应的应用程序, 并把配置加入到 /etc/inetd.conf 文件, 或去掉当前配置中的某些注释。 如何使用和配置 inetdinetd 一节中进行了更为深入的阐述。

一些情况下, 通过 cron(8) 来启动系统服务也是一种可行的选择。 这种方法有很多好处, 因为 cron 会以 crontab 的文件属主身份执行那些进程。 这使得普通用户也能够执行他们的应用。

cron 工具提供了一个独有的功能, 以 @reboot 来指定时间。 这样的设置将在 cron(8) 启动时运行, 通常这也是系统初始化的时候。