update-rc.d
install and remove System-V style init script links
see also :
init
Synopsis
update-rc.d
[-n] [-f] name
remove
update-rc.d
[-n] name
defaults [NN | SS KK]
update-rc.d
[-n] name
start|stop NN runlevel
[runlevel]... .
start|stop NN
runlevel [runlevel]... . ...
update-rc.d
[-n] name
disable|enable [ S|2|3|4|5 ]
add an example, a script, a trick and tips
examples
Insert links using the defaults:
update-rc.d foobar defaults
The equivalent dependency header would have start and stop
dependencies on $remote_fs and $syslog, and start in
runlevels 2-5 and stop in runlevels 0, 1 and 6.
Equivalent command using explicit argument sets:
update-rc.d foobar start 20 2 3 4 5 . stop 20 0 1 6 .
More typical command using explicit argument sets:
update-rc.d foobar start 30 2 3 4 5 . stop 70 0 1 6 .
Insert links at default runlevels when B requires A
update-rc.d script_for_A defaults 80 20
update-rc.d script_for_B defaults 90 10
Insert a link to a service that (presumably) will not be needed
by any other daemon
update-rc.d top_level_app defaults 98 02
Insert links for a script that requires services that start/stop
at sequence number 20
update-rc.d script_depends_on_svc20 defaults 21 19
Remove all links for a script (assuming foobar has been deleted
already):
update-rc.d foobar remove
Example of disabling a service:
update-rc.d -f foobar remove
update-rc.d foobar stop 20 2 3 4 5 .
Example of a command for installing a system
initialization-and-shutdown script:
update-rc.d foobar start 45 S . stop 31 0 6 .
Example of a command for disabling a system
initialization-and-shutdown script:
update-rc.d -f foobar remove
update-rc.d foobar stop 45 S .
description
update-rc.d
updates the System V style init script links
/etc/rcrunlevel.d/NNname whose
target is the script /etc/init.d/name. These
links are run by init when it changes runlevels; they
are generally used to start and stop system services such as
daemons. runlevel is one of the runlevels supported
by init, namely, 0123456789S, and NN is
the two-digit sequence number that determines where in
the sequence init will run the scripts.
This manpage
documents only the usage and behaviour of
update-rc.d. For a discussion of the System V
style init script arrangements please see init(8) and
the Debian Policy Manual.
options
-n
Don’t do anything, just
show what we would do.
-f
Force removal of symlinks even if
/etc/init.d/name still exists.
disabling init script start links
When run with the disable [ S|2|3|4|5 ] options,
update-rc.d modifies existing runlevel links for the
script /etc/init.d/name by renaming start links to
stop links with a sequence number equal to the difference of 100
minus the original sequence number.
When run with the enable [ S|2|3|4|5 ] options,
update-rc.d modifies existing runlevel links for the
script /etc/init.d/name by renaming stop links to
start links with a sequence number equal to the positive
difference of current sequence number minus 100, thus returning
to the original sequence number that the script had been
installed with before disabling it.
Both of these options only operate on start runlevel links of S,
2, 3, 4 or 5. If no start runlevel is specified after the disable
or enable keywords, the script will attempt to modify links in
all start runlevels.
files
/etc/init.d/
The directory containing the actual init scripts.
/etc/rc?.d/
The directories containing the links used by init and
managed by update-rc.d.
/etc/init.d/skeleton
Model for use by writers of init.d scripts.
/var/lib/sysv-rc/legacy-bootsequence
Flag indicating the machine is using legacy mode for boot script
ordering.
installing init script links
update-rc.d has two modes of operation for installing scripts
into the boot sequence. A legacy mode where command line
arguments are used to decide the sequence and runlevel
configuration, and the default mode where dependency and runlevel
information in the init.d script LSB comment header is used
instead. Such header is required to be present in init.d scripts.
See the insserv(8) manual page for details about the LSB header
format. The boot sequencing method is decided during installation
or upgrades. During upgrades, if there are no loops in the
dependencies declared by LSB headers of all installed init.d
scripts and no obsolete init.d scripts, the boot system is
converted to dependency based boot sequencing. The conversion to
dependency based boot sequencing is one-way. The machines using
the legacy mode will have a file /etc/init.d/.legacy-bootordering
.
Packages installing init.d scripts should make sure both methods
work, for compatiblity with systems where the migration have not
been done yet.
For legacy mode, the following section documents the old
behaviour.
When run with either the defaults, start, or
stop options, update-rc.d makes links
/etc/rcrunlevel.d/[SK]NNname that
point to the script /etc/init.d/name.
If any files
/etc/rcrunlevel.d/[SK]??name already
exist then update-rc.d does nothing. The program was
written this way so that it will never change an existing
configuration, which may have been customized by the system
administrator. The program will only install links if none are
present, i.e., if it appears that the service has never been
installed before.
A common system administration error is to delete the links with
the thought that this will "disable" the service, i.e., that this
will prevent the service from being started. However, if all
links have been deleted then the next time the package is
upgraded, the package’s postinst script will run
update-rc.d again and this will reinstall links at their
factory default locations. The correct way to disable services is
to configure the service as stopped in all runlevels in which it
is started by default. In the System V init system this means
renaming the service’s symbolic links from S to K.
If defaults is used then update-rc.d will make
links to start the service in runlevels 2345 and to stop
the service in runlevels 016. By default all the links
will have sequence number 20, but this should be overridden if
there are dependencies. For example if daemon B depends on A,
then A must be started before B and B must be killed before A.
You accomplish this by supplying two NN arguments. In general,
core daemons should start early and be killed late, whilst
applications can start late and be killed early. See EXAMPLES
below.
The first NN argument supplies the start sequence number and the
second NN argument supplies the kill sequence number. Kill
scripts are called first, passing a stop argument. Then start
scripts are called passing a start argument. In either case,
calls happen in ascending sequence number order.
Supplying a single NN argument will use the same number for both
start and kill links. This is supported for backward
compatibility but is discouraged, as it may lead to inconsistent
settings. As a rule of thumb, if you increase the start sequence
number you should also decrease the stop sequence number, and
vice-versa.
As a rule of thumb, the sequence number of the stop link should
be 100 minus the sequence number of the start link; this causes
services to be stopped in the opposite order to that in which
they are started. Obviously, therefore, the default stop sequence
number should be 80. Defaulting to 20, as update-rc.d
does, is an old bug that cannot be fixed because of the risk of
breaking things.
Instead of defaults one can give one or more sets of
arguments specifying particular runlevels in which to start or
stop the service. Each of these sets of arguments starts with the
keyword start or stop and a sequence number
NN, followed by one or more runlevel numbers. The set is
terminated by a solitary full stop character. When explicit
specification, rather than defaults, is used there will
usually be one start and one stop set. If different
sequence codes are required in different runlevels then several
start sets or several stop sets may be specified.
If this is done and the same runlevel is named in multiple sets
then only the last one counts. Therefore it is not possible to
create multiple start or multiple stop links for a
service in a single runlevel directory.
The script /etc/init.d/name must exist before
update-rc.d is run to create the links.
removing scripts
When invoked with the remove option, update-rc.d removes
any links in the /etc/rcrunlevel.d
directories to the script /etc/init.d/name. The
script must have been deleted already. If the script is still
present then update-rc.d aborts with an error message.
update-rc.d is usually called from a package’s
post-removal script when that script is given the purge
argument. Any files in the /etc/rcrunlevel.d
directories that are not symbolic links to the script
/etc/init.d/name will be left untouched.
bugs
See
http://bugs.debian.org/sysv-rc.
see also
Debian
Policy Manual,
/etc/ init .d/skeleton,
insserv, sysv-rc-conf,
bum, init.