# Initscripts/Writing rc.d scripts

Related articles

- Arch boot process
- Daemon
- rc.conf

Initscripts uses rc.d scripts to used to control the starting, stopping and restarting of daemons.

## Guideline

- Source `/etc/rc.conf`, `/etc/rc.d/functions`, and optionally `/etc/conf.d/DAEMON_NAME`.
- Arguments and other daemon options should be placed in `/etc/conf.d/DAEMON_NAME`. This is done to separate configuration from logic and to keep a consistent style among daemon scripts.
- Use functions in `/etc/rc.d/functions` instead of duplicating their functionality.
- Include at least start, stop and restart as arguments to the script.

## Available functions

- There are some functions provided by `/etc/rc.d/functions`:
  - `stat_busy "message"`: set status busy for printed message (e.g. Starting daemon [BUSY])
  - `stat_done`: set status done (e.g. Starting daemon [DONE])
  - `stat_fail`: set status failed (e.g. Starting daemon [FAILED])
  - `get_pid program`: get PID of the program
  - `ck_pidfile PID-file program`: check whether PID-file is still valid for the program (e.g. ck_pidfile /var/run/daemon.pid daemon || rm -f /var/run/daemon.pid)
  - `[add|rm]_daemon program`: add/remove program to running daemons (stored in `/run/daemons/`)

Full list of functions is much longer and most possibilities (like way to control whether or not non-root users can launch daemon) are still undocumented and can be learned only from `/etc/rc.d/functions` source. See also `man rc.d`.

## Example

The following is an example for crond. Look in `/etc/rc.d` for greater variety.

The configuration file:

    /etc/conf.d/crond

    ARGS="-S -l info"

The actual script:

    /etc/rc.d/crond

    #!/bin/bash

    . /etc/rc.conf
    . /etc/rc.d/functions

    DAEMON=crond
    ARGS=

    [ -r /etc/conf.d/$DAEMON ] && . /etc/conf.d/$DAEMON

    PID=$(get_pid $DAEMON)

    case "$1" in
     start)
       stat_busy "Starting $DAEMON"
       [ -z "$PID" ] && $DAEMON $ARGS &>/dev/null
       if [ $? = 0 ]; then
         add_daemon $DAEMON
         stat_done
       else
         stat_fail
         exit 1
       fi
       ;;
     stop)
       stat_busy "Stopping $DAEMON"
       [ -n "$PID" ] && kill $PID &>/dev/null
       if [ $? = 0 ]; then
         rm_daemon $DAEMON
         stat_done
       else
         stat_fail
         exit 1
       fi
       ;;
     restart)
       $0 stop
       sleep 1
       $0 start
       ;;
     *)
       echo "usage: $0 {start|stop|restart}"
    esac

Categories:

- Boot process
- Package development