---
name: "runlevel"
section: "7"
platform: "linux"
package: "upstart"
version: "1.11-5"
release: "Debian 8 (Jessie)"
platforms: ["linux"]
url: "https://new.carta.tech/runlevel/7"
---

# runlevel(7)

event signalling change of system runlevel

## NAME

runlevel - event signalling change of system runlevel

## SYNOPSIS

**runlevel** **RUNLEVEL=***RUNLEVEL* **PREVLEVEL=***PREVLEVEL* \[*ENV*\]...

## DESCRIPTION

This page describes the **runlevel** Upstart event, and the general implementation of runlevels in the Upstart system.  For the runlevel tool, see [**runlevel**(8)](/runlevel/8.md)

### 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)](/shutdown/8.md) tool will supply an **INIT\_HALT** variable set to either *HALT* or *POWEROFF* when called with **-H** or **-P** respectively.

### Runlevels

Runlevels are a concept from UNIX® System V used by the [**init**(8)](/init/8.md) daemon or other system initialisation system to define modes of system operation.

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 authoritative 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* \<**http://www.debian.org/doc/debian-policy/ch-opersys.html#s-sysvinit**\>

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 be **S**.

### 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)](/init/8.md) 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 argument.

Initial system startup is provided by the */etc/init/rc-sysinit.conf* job.  This is run on the [**startup**(7)](/startup/7.md) event, and is primarily responsible for running the **/etc/init.d/rc** script with the special **S** argument and calling [**telinit**(8)](/telinit/8.md) 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 command-line.

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 runlevel.

### Implementation of runlevels in Upstart

The Upstart [**init**(8)](/init/8.md) daemon has no native concepts of runlevel, and unlike the System V daemon, makes no attempt to keep track of the current runlevel.

Instead a compatible implementation is provided by the [**runlevel**(8)](/runlevel/8.md), [**telinit**(8)](/telinit/8.md) and [**shutdown**(8)](/shutdown/8.md) tools supplied with Upstart.

The [**telinit**(8)](/telinit/8.md) and [**shutdown**(8)](/shutdown/8.md) 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)](/runlevel/8.md) 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 */var/run/utmp*.

The [**who**(1)](/who/1.md) **-r** command may also be used to read the current runlevel from */var/run/utmp*.

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)](/telinit/8.md) 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)](/telinit/8.md) invocation should have successfully written to it.

### Boot time records

The [**telinit**(8)](/telinit/8.md) 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)](/telinit/8.md) invocation to do the switch has **RUNLEVEL=***S* in its environment.

## EXAMPLE

A service running in the typical multi-user runlevels might use:

```
start on runlevel [2345]
stop on runlevel [!2345]
```

## SEE ALSO

[**runlevel**(8)](/runlevel/8.md) [**init**(8)](/init/8.md) [**telinit**(8)](/telinit/8.md) [**shutdown**(8)](/shutdown/8.md) [**who**(1)](/who/1.md)
