Initscripts/Writing rc.d scripts
Related articles
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