Difference between revisions of "Initscripts/Writing rc.d scripts"

From ArchWiki
Jump to: navigation, search
(New page: If a daemon accepts arguments, the script must have its equivalent in /etc/conf.d. A proper example for tftpd: /etc/conf.d/tftpd: TFTPD_ARGS="-l -s /var/tftpboot -c" /etc/rc.d/tftpd ...)
 
(34 intermediate revisions by 11 users not shown)
Line 1: Line 1:
If a daemon accepts arguments, the script must have its equivalent in /etc/conf.d.
+
[[Category:Boot process]]
 +
[[Category:Package development]]
 +
[[cs:Writing rc.d scripts]]
 +
[[es:Writing rc.d scripts]]
 +
[[zh-CN:Writing rc.d scripts]]
 +
{{Article summary start}}
 +
{{Article summary text|Writing rc.d daemon scripts.}}
 +
{{Article summary heading|Related}}
 +
{{Article summary wiki|Arch Boot Process}}
 +
{{Article summary wiki|Daemon}}
 +
{{Article summary wiki|rc.conf}}
 +
{{Article summary end}}
  
 +
[[Initscripts]] uses rc.d scripts to used to control the starting, stopping and restarting of [[Daemon|daemons]].
  
A proper example for tftpd:
+
== Guideline ==
 +
* Source {{ic|/etc/rc.conf}}, {{ic|/etc/rc.d/functions}}, and optionally {{ic|/etc/conf.d/DAEMON_NAME}}.
 +
* Arguments and other daemon options should be placed in {{ic|/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 {{ic|/etc/rc.d/functions}} instead of duplicating their functionality.
 +
* Include at least start, stop and restart as arguments to the script.
  
/etc/conf.d/tftpd:
+
== Available functions ==
TFTPD_ARGS="-l -s /var/tftpboot -c"
+
* There are some functions provided by {{ic|/etc/rc.d/functions}}:
 +
** {{Ic|stat_busy "''message''"}}: set status ''busy'' for printed message (e.g. <nowiki>Starting daemon  [BUSY]</nowiki>)
 +
** {{Ic|stat_done}}: set status ''done'' (e.g. <nowiki>Starting daemon  [DONE]</nowiki>)
 +
** {{Ic|stat_fail}}: set status ''failed'' (e.g. <nowiki>Starting daemon  [FAILED]</nowiki>)
 +
** {{Ic|get_pid ''program''}}: get PID of the program
 +
** {{Ic|ck_pidfile ''PID-file'' ''program''}}: check whether PID-file is still valid for the program (e.g. <nowiki>ck_pidfile /var/run/daemon.pid daemon || rm -f /var/run/daemon.pid</nowiki>)
 +
** {{Ic|<nowiki>[add|rm]_daemon</nowiki> ''program''}}: add/remove program to running daemons (stored in {{ic|/run/daemons/}})
  
/etc/rc.d/tftpd
+
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 {{ic|/etc/rc.d/functions}} source. See also {{Ic|man rc.d}}.
+
 
 +
== Example ==
 +
The following is an example for ''crond''. Look in {{ic|/etc/rc.d}} for greater variety.
 +
 
 +
The configuration file:
 +
{{hc|/etc/conf.d/crond|2=<nowiki>ARGS="-S -l info"</nowiki>}}
 +
 
 +
The actual script:
 +
{{hc|/etc/rc.d/crond|2=<nowiki>
 
#!/bin/bash
 
#!/bin/bash
  
Line 14: Line 44:
 
. /etc/rc.d/functions
 
. /etc/rc.d/functions
  
TFTPD_ARGS=
+
DAEMON=crond
[ -f /etc/conf.d/tftpd ] && . /etc/conf.d/tftpd
+
ARGS=
 +
 
 +
[ -r /etc/conf.d/$DAEMON ] && . /etc/conf.d/$DAEMON
 +
 
 +
PID=$(get_pid $DAEMON)
  
PID=`pidof -o %PPID /usr/sbin/in.tftpd`
 
 
case "$1" in
 
case "$1" in
  start)
+
start)
    stat_busy "Starting TFTPD"
+
  stat_busy "Starting $DAEMON"
    [ -z "$PID" ] && /usr/sbin/in.tftpd ${TFTPD_ARGS}
+
  [ -z "$PID" ] && $DAEMON $ARGS &>/dev/null
    if [ $? -gt 0 ]; then
+
  if [ $? = 0 ]; then
      stat_fail
+
    add_daemon $DAEMON
    else
+
    stat_done
      add_daemon in.tftpd
+
  else
      stat_done
+
    stat_fail
    fi
+
    exit 1
    ;;
+
  fi
  stop)
+
  ;;
    stat_busy "Stopping TFTPD"
+
stop)
    [ ! -z "$PID" ] && kill $PID &> /dev/null
+
  stat_busy "Stopping $DAEMON"
    if [ $? -gt 0 ]; then
+
  [ -n "$PID" ] && kill $PID &>/dev/null
      stat_fail
+
  if [ $? = 0 ]; then
    else
+
    rm_daemon $DAEMON
      rm_daemon in.tftpd
+
    stat_done
      stat_done
+
  else
    fi
+
    stat_fail
    ;;
+
    exit 1
  restart)
+
  fi
    $0 stop
+
  ;;
    $0 start
+
restart)
    ;;
+
  $0 stop
  *)
+
  sleep 1
    echo "usage: $0 {start|stop|restart}"   
+
  $0 start
 +
  ;;
 +
*)
 +
  echo "usage: $0 {start|stop|restart}"   
 
esac
 
esac
exit 0
+
</nowiki>}}

Revision as of 06:00, 26 October 2012

Summary help replacing me
Writing rc.d daemon scripts.
Related
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