FreeBSD Handbook
Prev | Chapter 12 Configuration and Tuning | Next

# 12.7 Using rc(8) Under FreeBSD

Contributed by Tom Rhodes.

In 2002 FreeBSD integrated the NetBSD `rc.d` system for system initialization. Users should notice the files listed in the `/etc/rc.d` directory. Many of these files are for basic services which can be controlled with the `start`, `stop`, and `restart` options. For instance, sshd(8) can be restarted with the following command:

    # /etc/rc.d/sshd restart

This procedure is similar for other services. Of course, services are usually started automatically at boot time as specified in rc.conf(5). For example, enabling the Network Address Translation daemon at startup is as simple as adding the following line to `/etc/rc.conf`:

    natd_enable="YES"

If a `natd_enable="NO"` line is already present, then simply change the `NO` to `YES`. The rc scripts will automatically load any other dependent services during the next reboot, as described below.

Since the `rc.d` system is primarily intended to start/stop services at system startup/shutdown time, the standard `start`, `stop` and `restart` options will only perform their action if the appropriate `/etc/rc.conf` variables are set. For instance the above `sshd restart` command will only work if `sshd_enable` is set to `YES` in `/etc/rc.conf`. To `start`, `stop` or `restart` a service regardless of the settings in `/etc/rc.conf`, the commands should be prefixed with one. For instance to restart `sshd` regardless of the current `/etc/rc.conf` setting, execute the following command:

    # /etc/rc.d/sshd onerestart

It is easy to check if a service is enabled in `/etc/rc.conf` by running the appropriate `rc.d` script with the option `rcvar`. Thus, an administrator can check that `sshd` is in fact enabled in `/etc/rc.conf` by running:

    # /etc/rc.d/sshd rcvar
    # sshd
    $sshd_enable=YES

> Note: The second line (`# sshd`) is the output from the `sshd` command, not a `root` console.

To determine if a service is running, a `status` option is available. For instance to verify that `sshd` is actually started:

    # /etc/rc.d/sshd status
    sshd is running as pid 433.

In some cases it is also possible to `reload` a service. This will attempt to send a signal to an individual service, forcing the service to reload its configuration files. In most cases this means sending the service a `SIGHUP` signal. Support for this feature is not included for every service.

The `rc.d` system is not only used for network services, it also contributes to most of the system initialization. For instance, consider the `bgfsck` file. When this script is executed, it will print out the following message:

    Starting background file system checks in 60 seconds.

Therefore this file is used for background file system checks, which are done only during system initialization.

Many system services depend on other services to function properly. For example, NIS and other RPC-based services may fail to start until after the `rpcbind` (portmapper) service has started. To resolve this issue, information about dependencies and other meta-data is included in the comments at the top of each startup script. The rcorder(8) program is then used to parse these comments during system initialization to determine the order in which system services should be invoked to satisfy the dependencies.

The following words must be included in all startup scripts (they are required by rc.subr(8) to enable the startup script):

- `PROVIDE`: Specifies the services this file provides.

The following words may be included at the top of each startup file. They are not strictly necessary, but they are useful as hints to rcorder(8):

- `REQUIRE`: Lists services which are required for this service. This file will run after the specified services.

- `BEFORE`: Lists services which depend on this service. This file will run before the specified services.

By carefully setting these keywords for each startup script, an administrator has a very fine-grained level of control of the startup order of the scripts, without the hassle of runlevels like some other UNIX® operating systems.

Additional information about the `rc.d` system can be found in the rc(8) and rc.subr(8) manual pages. If you are interested in writing your own `rc.d` scripts or improving the existing ones, you may find this article also useful.

Prev | Home | Next
Configuring the `cron` Utility | Up | Setting Up Network Interface Cards