G. Pape

runit - a UNIX init scheme with service supervision


How to install runit
Upgrading from previous versions of runit

Benefits
How to replace init
How to use dietlibc

Runlevels
Dependencies
A collection of run scripts

The runit program
The runit-init program

The runsvdir program
The runsv program
The runsvchdir program

The utmpset program
The svwaitdown program
The svwaitup program

The runsvstat program (not installed by default)
The runsvctrl program (not installed by default)


runit is a daemontools alike replacement for sysvinit and other init schemes. runit runs on GNU/Linux, OpenBSD, FreeBSD, and can easily be adapted to other unix operating systems. If runit runs for you on any other operating system or linux distribution, please let me know.

Warning: Replacing sysvinit or init can cause the system's boot to fail. Make sure you are able to recover and repair your system, for example if you run a boot loader, it should be able to pass init=/bin/sh to the kernel.


runit is discussed on the <supervision@list.skarnet.org> mailing list. To subscribe send an empty email to <supervision-subscribe@list.skarnet.org>.
The command runit is intended to run as Unix process no 1, it is automatically started by the runit-init /sbin/init-replacement if this is started by the kernel.

runit performs the system's booting, running and shutting down in three stages:

These are working examples for debian woody: /etc/runit/1, /etc/runit/2, /etc/runit/3.

The command runit-init is intended to replace /sbin/init. sysvinit's command shutdown will keep working. On *BSD systems use init 0 for system halt and init 6 for reboot. Runlevels are handled through the runsvdir and runsvchdir programs. Service dependencies are rudimentarily handled through the svwaitup and svwaitdown programs, see Dependencies and runlevels for an example.

runit is optimized for reliability and small size. The amount of code in process no 1 should be minimal.


runit in use: I replaced sysvinit with runit on several server systems and a laptop running Debian/GNU Linux sarge, woody and potato, and did not encounter any problems. Of course also the smarden.org content server is running with runit as process no 1, here is an example:
  # strings /proc/1/exe |grep Id
  $Id: runit.c,v 1.7 2002/02/13 09:59:52 pape Exp $
  # uptime
   14:36:29 up 88 days,  1:51,  2 users,  load average: 0.20, 0.13, 0.04
  # ps axuw |head -n20
  USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
  root         1  0.0  0.0    20   16 ?        S     2002   0:05 runit
  root         2  0.0  0.0     0    0 ?        SW    2002   0:00 [keventd]
  root         3  0.0  0.0     0    0 ?        SWN   2002   0:00 [ksoftirqd_CPU0]
  root         4  0.0  0.0     0    0 ?        SW    2002   0:16 [kswapd]
  root         5  0.0  0.0     0    0 ?        SW    2002   0:00 [bdflush]
  root         6  0.0  0.0     0    0 ?        SW    2002   0:01 [kupdated]
  root       168  0.0  0.2  1652  584 ?        S     2002   0:00 /usr/sbin/cron
  root       174  0.0  0.0    36   24 ?        S     2002   0:00 runsvdir /service log: ........................................................................................................
  root       176  0.0  0.0    20   20 ?        S     2002   0:00 runsv qmail-send
  root       177  0.0  0.0    20   20 ?        S     2002   0:00 runsv getty-5
  root       178  0.0  0.0    20   20 ?        S     2002   0:00 runsv getty-4
  root       179  0.0  0.0    20   20 ?        S     2002   0:00 runsv getty-3
  root       180  0.0  0.0    20   20 ?        S     2002   0:00 runsv getty-2
  root       181  0.0  0.0    20   20 ?        S     2002   0:00 runsv qmail-smtpd
  root       182  0.0  0.0    20   20 ?        S     2002   0:00 runsv socklog-unix
  root       183  0.0  0.1  1256  384 tty5     S     2002   0:00 getty 38400 tty5 linux
  root       184  0.0  0.1  1256  384 tty3     S     2002   0:00 getty 38400 tty3 linux
  root       185  0.0  0.0    20   20 ?        S     2002   0:00 runsv socklog-klog
  root       186  0.0  0.0    20   20 ?        S     2002   0:00 runsv ssh
# pstree
  runit-+-bdflush
        |-cron
        |-keventd
        |-ksoftirqd_CPU0
        |-kswapd
        |-kupdated
        `-runsvdir-+-runsv-+-multilog
                   |       `-qmail-send-+-qmail-clean
                   |                    |-qmail-lspawn
                   |                    `-qmail-rspawn
                   |-4*[runsv---getty]
                   |-runsv-+-multilog
                   |       `-tcpserver---qmail-smtpd
                   |-2*[runsv-+-multilog]
                   |          `-socklog]
                   |-runsv-+-multilog
                   |       `-sshd-+-2*[sshd---sshd---tail]
                   |              |-sshd---sshd---bash
                   |              `-sshd---sshd---bash---bash---pstree
                   |-runsv---clockspeed
                   |-runsv-+-dnscache
                   |       `-multilog
                   |-runsv---apache-ssl-+-20*[apache-ssl]
                   |                    |-gcache
                   |                    `-4*[multilog]
                   |-6*[runsv-+-multilog]
                   |          `-tcpserver]
                   |-3*[runsv-+-multilog]
                   |          `-tinydns]
                   `-runsv---uncat
This is from a more busy system:
  # strings /proc/1/exe |grep Id
  $Id: runit.c,v 1.6 2002/01/29 18:56:36 pape Exp $
  # uptime
   15:04:34 up 201 days, 15:34,  3 users,  load average: 0.08, 0.03, 0.01
  # ps axuw |head
  USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
  root         1  0.0  0.0    24    0 ?        SW   Feb07   0:05 runit
  root         2  0.0  0.0     0    0 ?        SW   Feb07   0:01 [keventd]
  root         3  0.0  0.0     0    0 ?        SW   Feb07   1:45 [kapm-idled]
  root         4  0.0  0.0     0    0 ?        SWN  Feb07   1:21 [ksoftirqd_CPU0]
  root         5  0.0  0.0     0    0 ?        SW   Feb07  31:40 [kswapd]
  root         6  0.0  0.0     0    0 ?        SW   Feb07   0:06 [bdflush]
  root         7  0.0  0.0     0    0 ?        SW   Feb07  14:26 [kupdated]
  root        53  0.0  0.0     0    0 ?        SW   Feb07   0:00 [msp3410 [auto]]
  daemon     115  0.0  0.0  1412    0 ?        SW   Feb07   0:00 /sbin/portmap

See How to install runit for installing runit and How to replace init for smoothly escaping from sysvinit.
If runit on linux is compiled and linked with dietlibc it yields in a statically linked runit binary of 9.7k size and this ps axuw output on my system:
  USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
  root         1  0.0  0.0    20   16 ?        S     2002   0:02 runit
I recommend doing this; for instructions, see How to use dietlibc.
See http://smarden.org/runit/ for recent informations.
Related links:
Gerrit Pape <pape@smarden.org>
$Id: index.html,v 1.22 2003/02/25 12:51:38 pape Exp $