11.5. 启动服务

Contributed by Tom Rhodes.

很多 FreeBSD 用户选择用ports来安装第三方软件。 大多数情况下需要一种方式来配置软件, 这种方式可以让软件在系统初始化之后就启动。 很多软件需要在系统初始化时就启动,类似于其中的两个 mail/postfix 或者 www/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 的应用程序。 可以在 /etc/rc.conf 中加入这样一行:

utility_enable="YES"

可以用如下方法来启动:

# /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.subr 中所提供的功能, 兼容 rcorder(8) 工具并提供更简单的通过 rc.conf 文件来配置的方法。 实际上它甚至可以放到 /etc/rc.d 目录中。 当然, 在使用 mergemaster(8) 来完成软件升级时这会带来一些麻烦。

11.5.2. 使用服务来启动服务

其他服务, 例如 POP3 服务器, IMAP, 等等, 可以通过 inetd(8) 来启动。 这样的过程包括从 ports collection 安装相应的程序, 并把配置添加进 /etc/inetd.conf 文件, 或去掉当前配置中的注释。 如何使用 inetd 并进行配置在 inetd 一节中有深入的阐述。

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

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