runlevel - event signalling change of system runlevel
runlevel RUNLEVEL=RUNLEVEL PREVLEVEL=PREVLEVEL [ENV]...
This page describes the runlevel Upstart event, and the general
implementation of runlevels in the Upstart system. For the runlevel
tool, see runlevel(8)
The runlevel event
The runlevel event signals a change of system runlevel. The new system
runlevel is given in the RUNLEVEL argument, and the previous system
runlevel in the PREVLEVEL argument (which may be empty).
Additional environment may follow these depending on the runlevel, and
the tool that emitted the event. The shutdown(8) tool will supply an
INIT_HALT variable set to either HALT or POWEROFF when called with -H
or -P respectively.
Runlevels are a concept from UNIX(R) System V used by the init(8)
daemon or other system initialisation system to define modes of system
Eight runlevels are permitted, the first seven are numbered 0-6 and the
eighth is named S or s (both are permitted).
Services and other system components are said to exist in one or more
runlevels. When switching from one runlevel to another, the services
that should not exist in the new runlevel are stopped and the services
that only exist in the new runlevel are started.
This is performed by the /etc/init.d/rc script executed on a change of
runlevel (by jobs run on the runlevel event in the Upstart system).
This script examines symlinks in the /etc/rc?.d directories, symlinks
beginning K are services to be stopped and symlinks beginning S are
services to be started.
The authorative documentation for this process can be found in the
System run levels and init.d scripts section of the Debian Policy
Manual. This may be currently found at
Runlevels 0, 1 and 6 are reserved. Runlevel 0 is used to halt the
system and 6 to reboot the system. Runlevel 1 is used to bring the
system back down into single-user mode, after which the runlevel will
System V initialisation in Upstart
The compatible implementation of runlevels permits Upstart jobs to be
run on the runlevel event that perform the same functionality as the
original System V init(8) daemon.
The /etc/init/rc.conf job is run on the runlevel event, thus receiving
the RUNLEVEL and PREVLEVEL environment variables. Its sole job is to
execute the /etc/init.d/rc script, passing the new runlevel as an
Initial system startup is provided by the /etc/init/rc-sysinit.conf
job. This is run on the startup(7) event, and is primarily responsible
for running the /etc/init.d/rc script with the special S argument and
calling telinit(8) to switch into the default runlevel when done. This
also handles the -b, emergency, -s and single kernel command-line
options as well as specifying an alternate runlevel on the kernel
Finally the /etc/init/rcS.conf job handles the special case of entering
the single-user runlevel and providing a login shell. Once that shell
terminates, this restarts the rc-sysinit job to re-enter the default
Implementation of runlevels in Upstart
The Upstart init(8) daemon has no native concepts of runlevel, and
unlike the System V daemon, makes no attempt to keep track of the
Instead a compatible implementation is provided by the runlevel(8),
telinit(8) and shutdown(8) tools supplied with Upstart.
The telinit(8) and shutdown(8) tools are used by system administrators
to change the runlevel, thus they both generate this runlevel event
obtaining the value for the PREVLEVEL environment variable from their
own environment (the RUNLEVEL variable) or the /var/run/utmp file.
Additionally they update the /var/run/utmp file with the new runlevel,
and append a log entry to the /var/log/wtmp file.
The runlevel(8) tool may be used by system administrators to obtain the
current runlevel, this reads the RUNLEVEL and PREVLEVEL variables from
its own environment or reads the current and previous runlevel from
The who(1) -r command may also be used to read the current runlevel
This provides full compatibility with System V.
During the boot scripts, where the /var/run/utmp file may not yet be
writable, the RUNLEVEL and PREVLEVEL environment variables will be
available so telinit(8) will still provide the correct values.
Once the boot scripts have finished, while the environment variables
may no longer be available, the /var/run/utmp file will be and the most
recent telinit(8) invocation should have successfully written to it.
Boot time records
The telinit(8) tool also takes care of writing the boot time record to
both /var/run/utmp and /var/log/wtmp.
This is written if the previous runlevel in these files does not match
the previous runlevel obtained from its environment. In general this
occurs when switching from runlevel S to the default runlevel, at which
point the /var/run/utmp and /var/log/wtmp files are both writable, and
the telinit(8) invocation to do the switch has RUNLEVEL=S in its
A service running in the typical multi-user runlevels might use:
start on runlevel 
stop on runlevel [!2345]
runlevel(8) init(8) telinit(8) shutdown(8) who(1)