summaryrefslogtreecommitdiff
path: root/man/systemd.service.xml
diff options
context:
space:
mode:
Diffstat (limited to 'man/systemd.service.xml')
-rw-r--r--man/systemd.service.xml1354
1 files changed, 0 insertions, 1354 deletions
diff --git a/man/systemd.service.xml b/man/systemd.service.xml
deleted file mode 100644
index 5c65957bda..0000000000
--- a/man/systemd.service.xml
+++ /dev/null
@@ -1,1354 +0,0 @@
-<?xml version='1.0'?> <!--*- Mode: nxml; nxml-child-indent: 2; indent-tabs-mode: nil -*-->
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
-
-<!--
- This file is part of systemd.
-
- Copyright 2010 Lennart Poettering
-
- systemd is free software; you can redistribute it and/or modify it
- under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
-
- systemd is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with systemd; If not, see <http://www.gnu.org/licenses/>.
--->
-
-<refentry id="systemd.service">
- <refentryinfo>
- <title>systemd.service</title>
- <productname>systemd</productname>
-
- <authorgroup>
- <author>
- <contrib>Developer</contrib>
- <firstname>Lennart</firstname>
- <surname>Poettering</surname>
- <email>lennart@poettering.net</email>
- </author>
- </authorgroup>
- </refentryinfo>
-
- <refmeta>
- <refentrytitle>systemd.service</refentrytitle>
- <manvolnum>5</manvolnum>
- </refmeta>
-
- <refnamediv>
- <refname>systemd.service</refname>
- <refpurpose>Service unit configuration</refpurpose>
- </refnamediv>
-
- <refsynopsisdiv>
- <para><filename><replaceable>service</replaceable>.service</filename></para>
- </refsynopsisdiv>
-
- <refsect1>
- <title>Description</title>
-
- <para>A unit configuration file whose name ends in
- <filename>.service</filename> encodes information about a process
- controlled and supervised by systemd.</para>
-
- <para>This man page lists the configuration options specific to
- this unit type. See
- <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- for the common options of all unit configuration files. The common
- configuration items are configured in the generic
- <literal>[Unit]</literal> and <literal>[Install]</literal>
- sections. The service specific configuration options are
- configured in the <literal>[Service]</literal> section.</para>
-
- <para>Additional options are listed in
- <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
- which define the execution environment the commands are executed
- in, and in
- <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
- which define the way the processes of the service are terminated,
- and in
- <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
- which configure resource control settings for the processes of the
- service.</para>
-
- <para>If a service is requested under a certain name but no unit
- configuration file is found, systemd looks for a SysV init script
- by the same name (with the <filename>.service</filename> suffix
- removed) and dynamically creates a service unit from that script.
- This is useful for compatibility with SysV. Note that this
- compatibility is quite comprehensive but not 100%. For details
- about the incompatibilities, see the <ulink
- url="http://www.freedesktop.org/wiki/Software/systemd/Incompatibilities">Incompatibilities
- with SysV</ulink> document.</para>
- </refsect1>
-
- <refsect1>
- <title>Automatic Dependencies</title>
-
- <para>Services with <varname>Type=dbus</varname> set automatically
- acquire dependencies of type <varname>Requires=</varname> and
- <varname>After=</varname> on
- <filename>dbus.socket</filename>.</para>
-
- <para>Socket activated services are automatically ordered after
- their activating <filename>.socket</filename> units via an
- automatic <varname>After=</varname> dependency.
- Services also pull in all <filename>.socket</filename> units
- listed in <varname>Sockets=</varname> via automatic
- <varname>Wants=</varname> and <varname>After=</varname> dependencies.</para>
-
- <para>Unless <varname>DefaultDependencies=</varname> in the <literal>[Unit]</literal> is set to
- <option>false</option>, service units will implicitly have dependencies of type <varname>Requires=</varname> and
- <varname>After=</varname> on <filename>sysinit.target</filename>, a dependency of type <varname>After=</varname> on
- <filename>basic.target</filename> as well as dependencies of type <varname>Conflicts=</varname> and
- <varname>Before=</varname> on <filename>shutdown.target</filename>. These ensure that normal service units pull in
- basic system initialization, and are terminated cleanly prior to system shutdown. Only services involved with early
- boot or late system shutdown should disable this option.</para>
-
- <para>Instanced service units (i.e. service units with an <literal>@</literal> in their name) are assigned by
- default a per-template slice unit (see
- <citerefentry><refentrytitle>systemd.slice</refentrytitle><manvolnum>5</manvolnum></citerefentry>), named after the
- template unit, containing all instances of the specific template. This slice is normally stopped at shutdown,
- together with all template instances. If that is not desired, set <varname>DefaultDependencies=no</varname> in the
- template unit, and either define your own per-template slice unit file that also sets
- <varname>DefaultDependencies=no</varname>, or set <varname>Slice=system.slice</varname> (or another suitable slice)
- in the template unit. Also see
- <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
-
- <para>Additional implicit dependencies may be added as result of
- execution and resource control parameters as documented in
- <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- and
- <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>.</para>
- </refsect1>
-
- <refsect1>
- <title>Options</title>
-
- <para>Service files must include a <literal>[Service]</literal>
- section, which carries information about the service and the
- process it supervises. A number of options that may be used in
- this section are shared with other unit types. These options are
- documented in
- <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- and
- <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
- The options specific to the <literal>[Service]</literal> section
- of service units are the following:</para>
-
- <variablelist class='unit-directives'>
- <varlistentry>
- <term><varname>Type=</varname></term>
-
- <listitem><para>Configures the process start-up type for this
- service unit. One of
- <option>simple</option>,
- <option>forking</option>,
- <option>oneshot</option>,
- <option>dbus</option>,
- <option>notify</option> or
- <option>idle</option>.</para>
-
- <para>If set to <option>simple</option> (the default if
- neither <varname>Type=</varname> nor
- <varname>BusName=</varname>, but <varname>ExecStart=</varname>
- are specified), it is expected that the process configured
- with <varname>ExecStart=</varname> is the main process of the
- service. In this mode, if the process offers functionality to
- other processes on the system, its communication channels
- should be installed before the daemon is started up (e.g.
- sockets set up by systemd, via socket activation), as systemd
- will immediately proceed starting follow-up units.</para>
-
- <para>If set to <option>forking</option>, it is expected that
- the process configured with <varname>ExecStart=</varname> will
- call <function>fork()</function> as part of its start-up. The
- parent process is expected to exit when start-up is complete
- and all communication channels are set up. The child continues
- to run as the main daemon process. This is the behavior of
- traditional UNIX daemons. If this setting is used, it is
- recommended to also use the <varname>PIDFile=</varname>
- option, so that systemd can identify the main process of the
- daemon. systemd will proceed with starting follow-up units as
- soon as the parent process exits.</para>
-
- <para>Behavior of <option>oneshot</option> is similar to
- <option>simple</option>; however, it is expected that the
- process has to exit before systemd starts follow-up units.
- <varname>RemainAfterExit=</varname> is particularly useful for
- this type of service. This is the implied default if neither
- <varname>Type=</varname> or <varname>ExecStart=</varname> are
- specified.</para>
-
- <para>Behavior of <option>dbus</option> is similar to
- <option>simple</option>; however, it is expected that the
- daemon acquires a name on the D-Bus bus, as configured by
- <varname>BusName=</varname>. systemd will proceed with
- starting follow-up units after the D-Bus bus name has been
- acquired. Service units with this option configured implicitly
- gain dependencies on the <filename>dbus.socket</filename>
- unit. This type is the default if <varname>BusName=</varname>
- is specified.</para>
-
- <para>Behavior of <option>notify</option> is similar to
- <option>simple</option>; however, it is expected that the
- daemon sends a notification message via
- <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry>
- or an equivalent call when it has finished starting up.
- systemd will proceed with starting follow-up units after this
- notification message has been sent. If this option is used,
- <varname>NotifyAccess=</varname> (see below) should be set to
- open access to the notification socket provided by systemd. If
- <varname>NotifyAccess=</varname> is missing or set to
- <option>none</option>, it will be forcibly set to
- <option>main</option>. Note that currently
- <varname>Type=</varname><option>notify</option> will not work
- if used in combination with
- <varname>PrivateNetwork=</varname><option>yes</option>.</para>
-
- <para>Behavior of <option>idle</option> is very similar to <option>simple</option>; however, actual execution
- of the service binary is delayed until all active jobs are dispatched. This may be used to avoid interleaving
- of output of shell services with the status output on the console. Note that this type is useful only to
- improve console output, it is not useful as a general unit ordering tool, and the effect of this service type
- is subject to a 5s time-out, after which the service binary is invoked anyway.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>RemainAfterExit=</varname></term>
-
- <listitem><para>Takes a boolean value that specifies whether
- the service shall be considered active even when all its
- processes exited. Defaults to <option>no</option>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>GuessMainPID=</varname></term>
-
- <listitem><para>Takes a boolean value that specifies whether
- systemd should try to guess the main PID of a service if it
- cannot be determined reliably. This option is ignored unless
- <option>Type=forking</option> is set and
- <option>PIDFile=</option> is unset because for the other types
- or with an explicitly configured PID file, the main PID is
- always known. The guessing algorithm might come to incorrect
- conclusions if a daemon consists of more than one process. If
- the main PID cannot be determined, failure detection and
- automatic restarting of a service will not work reliably.
- Defaults to <option>yes</option>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>PIDFile=</varname></term>
-
- <listitem><para>Takes an absolute file name pointing to the
- PID file of this daemon. Use of this option is recommended for
- services where <varname>Type=</varname> is set to
- <option>forking</option>. systemd will read the PID of the
- main process of the daemon after start-up of the service.
- systemd will not write to the file configured here, although
- it will remove the file after the service has shut down if it
- still exists.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>BusName=</varname></term>
-
- <listitem><para>Takes a D-Bus bus name that this service is
- reachable as. This option is mandatory for services where
- <varname>Type=</varname> is set to
- <option>dbus</option>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>ExecStart=</varname></term>
- <listitem><para>Commands with their arguments that are
- executed when this service is started. The value is split into
- zero or more command lines according to the rules described
- below (see section "Command Lines" below).
- </para>
-
- <para>Unless <varname>Type=</varname> is <option>oneshot</option>, exactly one command must be given. When
- <varname>Type=oneshot</varname> is used, zero or more commands may be specified. Commands may be specified by
- providing multiple command lines in the same directive, or alternatively, this directive may be specified more
- than once with the same effect. If the empty string is assigned to this option, the list of commands to start
- is reset, prior assignments of this option will have no effect. If no <varname>ExecStart=</varname> is
- specified, then the service must have <varname>RemainAfterExit=yes</varname> set.</para>
-
- <para>For each of the specified commands, the first argument must be an absolute path to an
- executable. Optionally, if this file name is prefixed with <literal>@</literal>, the second token will be
- passed as <literal>argv[0]</literal> to the executed process, followed by the further arguments specified. If
- the absolute filename is prefixed with <literal>-</literal>, an exit code of the command normally considered a
- failure (i.e. non-zero exit status or abnormal exit due to signal) is ignored and considered success. If the
- absolute path is prefixed with <literal>+</literal> then it is executed with full
- privileges. <literal>@</literal>, <literal>-</literal>, and <literal>+</literal> may be used together and they
- can appear in any order.</para>
-
- <para>If more than one command is specified, the commands are
- invoked sequentially in the order they appear in the unit
- file. If one of the commands fails (and is not prefixed with
- <literal>-</literal>), other lines are not executed, and the
- unit is considered failed.</para>
-
- <para>Unless <varname>Type=forking</varname> is set, the
- process started via this command line will be considered the
- main process of the daemon.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>ExecStartPre=</varname></term>
- <term><varname>ExecStartPost=</varname></term>
- <listitem><para>Additional commands that are executed before
- or after the command in <varname>ExecStart=</varname>,
- respectively. Syntax is the same as for
- <varname>ExecStart=</varname>, except that multiple command
- lines are allowed and the commands are executed one after the
- other, serially.</para>
-
- <para>If any of those commands (not prefixed with
- <literal>-</literal>) fail, the rest are not executed and the
- unit is considered failed.</para>
-
- <para><varname>ExecStart=</varname> commands are only run after
- all <varname>ExecStartPre=</varname> commands that were not prefixed
- with a <literal>-</literal> exit successfully.</para>
-
- <para><varname>ExecStartPost=</varname> commands are only run after
- the service has started successfully, as determined by <varname>Type=</varname>
- (i.e. the process has been started for <varname>Type=simple</varname>
- or <varname>Type=idle</varname>, the process exits successfully for
- <varname>Type=oneshot</varname>, the initial process exits successfully
- for <varname>Type=forking</varname>, <literal>READY=1</literal> is sent
- for <varname>Type=notify</varname>, or the <varname>BusName=</varname>
- has been taken for <varname>Type=dbus</varname>).</para>
-
- <para>Note that <varname>ExecStartPre=</varname> may not be
- used to start long-running processes. All processes forked
- off by processes invoked via <varname>ExecStartPre=</varname> will
- be killed before the next service process is run.</para>
-
- <para>Note that if any of the commands specified in <varname>ExecStartPre=</varname>,
- <varname>ExecStart=</varname>, or <varname>ExecStartPost=</varname> fail (and are not prefixed with
- <literal>-</literal>, see above) or time out before the service is fully up, execution continues with commands
- specified in <varname>ExecStopPost=</varname>, the commands in <varname>ExecStop=</varname> are skipped.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>ExecReload=</varname></term>
- <listitem><para>Commands to execute to trigger a configuration
- reload in the service. This argument takes multiple command
- lines, following the same scheme as described for
- <varname>ExecStart=</varname> above. Use of this setting is
- optional. Specifier and environment variable substitution is
- supported here following the same scheme as for
- <varname>ExecStart=</varname>.</para>
-
- <para>One additional, special environment variable is set: if
- known, <varname>$MAINPID</varname> is set to the main process
- of the daemon, and may be used for command lines like the
- following:</para>
-
- <programlisting>/bin/kill -HUP $MAINPID</programlisting>
-
- <para>Note however that reloading a daemon by sending a signal
- (as with the example line above) is usually not a good choice,
- because this is an asynchronous operation and hence not
- suitable to order reloads of multiple services against each
- other. It is strongly recommended to set
- <varname>ExecReload=</varname> to a command that not only
- triggers a configuration reload of the daemon, but also
- synchronously waits for it to complete.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>ExecStop=</varname></term>
- <listitem><para>Commands to execute to stop the service
- started via <varname>ExecStart=</varname>. This argument takes
- multiple command lines, following the same scheme as described
- for <varname>ExecStart=</varname> above. Use of this setting
- is optional. After the commands configured in this option are
- run, all processes remaining for a service are terminated
- according to the <varname>KillMode=</varname> setting (see
- <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
- If this option is not specified, the process is terminated by
- sending the signal specified in <varname>KillSignal=</varname>
- when service stop is requested. Specifier and environment
- variable substitution is supported (including
- <varname>$MAINPID</varname>, see above).</para>
-
- <para>Note that it is usually not sufficient to specify a
- command for this setting that only asks the service to
- terminate (for example, by queuing some form of termination
- signal for it), but does not wait for it to do so. Since the
- remaining processes of the services are killed using
- <constant>SIGKILL</constant> immediately after the command
- exited, this would not result in a clean stop. The specified
- command should hence be a synchronous operation, not an
- asynchronous one.</para>
-
- <para>Note that the commands specified in <varname>ExecStop=</varname> are only executed when the service
- started successfully first. They are not invoked if the service was never started at all, or in case its
- start-up failed, for example because any of the commands specified in <varname>ExecStart=</varname>,
- <varname>ExecStartPre=</varname> or <varname>ExecStartPost=</varname> failed (and weren't prefixed with
- <literal>-</literal>, see above) or timed out. Use <varname>ExecStopPost=</varname> to invoke commands when a
- service failed to start up correctly and is shut down again.</para>
-
- <para>It is recommended to use this setting for commands that communicate with the service requesting clean
- termination. When the commands specified with this option are executed it should be assumed that the service is
- still fully up and is able to react correctly to all commands. For post-mortem clean-up steps use
- <varname>ExecStopPost=</varname> instead.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>ExecStopPost=</varname></term>
- <listitem><para>Additional commands that are executed after the service is stopped. This includes cases where
- the commands configured in <varname>ExecStop=</varname> were used, where the service does not have any
- <varname>ExecStop=</varname> defined, or where the service exited unexpectedly. This argument takes multiple
- command lines, following the same scheme as described for <varname>ExecStart=</varname>. Use of these settings
- is optional. Specifier and environment variable substitution is supported. Note that – unlike
- <varname>ExecStop=</varname> – commands specified with this setting are invoked when a service failed to start
- up correctly and is shut down again.</para>
-
- <para>It is recommended to use this setting for clean-up operations that shall be executed even when the
- service failed to start up correctly. Commands configured with this setting need to be able to operate even if
- the service failed starting up half-way and left incompletely initialized data around. As the service's
- processes have been terminated already when the commands specified with this setting are executed they should
- not attempt to communicate with them.</para>
-
- <para>Note that all commands that are configured with this setting are invoked with the result code of the
- service, as well as the main process' exit code and status, set in the <varname>$SERVICE_RESULT</varname>,
- <varname>$EXIT_CODE</varname> and <varname>$EXIT_STATUS</varname> environment variables, see
- <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
- details.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>RestartSec=</varname></term>
- <listitem><para>Configures the time to sleep before restarting
- a service (as configured with <varname>Restart=</varname>).
- Takes a unit-less value in seconds, or a time span value such
- as "5min 20s". Defaults to 100ms.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>TimeoutStartSec=</varname></term>
- <listitem><para>Configures the time to wait for start-up. If a
- daemon service does not signal start-up completion within the
- configured time, the service will be considered failed and
- will be shut down again. Takes a unit-less value in seconds,
- or a time span value such as "5min 20s". Pass
- <literal>infinity</literal> to disable the timeout logic. Defaults to
- <varname>DefaultTimeoutStartSec=</varname> from the manager
- configuration file, except when
- <varname>Type=oneshot</varname> is used, in which case the
- timeout is disabled by default (see
- <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>TimeoutStopSec=</varname></term>
- <listitem><para>Configures the time to wait for stop. If a
- service is asked to stop, but does not terminate in the
- specified time, it will be terminated forcibly via
- <constant>SIGTERM</constant>, and after another timeout of
- equal duration with <constant>SIGKILL</constant> (see
- <varname>KillMode=</varname> in
- <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
- Takes a unit-less value in seconds, or a time span value such
- as "5min 20s". Pass <literal>infinity</literal> to disable the
- timeout logic. Defaults to
- <varname>DefaultTimeoutStopSec=</varname> from the manager
- configuration file (see
- <citerefentry><refentrytitle>systemd-system.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>).
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>TimeoutSec=</varname></term>
- <listitem><para>A shorthand for configuring both
- <varname>TimeoutStartSec=</varname> and
- <varname>TimeoutStopSec=</varname> to the specified value.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>RuntimeMaxSec=</varname></term>
-
- <listitem><para>Configures a maximum time for the service to run. If this is used and the service has been
- active for longer than the specified time it is terminated and put into a failure state. Note that this setting
- does not have any effect on <varname>Type=oneshot</varname> services, as they terminate immediately after
- activation completed. Pass <literal>infinity</literal> (the default) to configure no runtime
- limit.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>WatchdogSec=</varname></term>
- <listitem><para>Configures the watchdog timeout for a service.
- The watchdog is activated when the start-up is completed. The
- service must call
- <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry>
- regularly with <literal>WATCHDOG=1</literal> (i.e. the
- "keep-alive ping"). If the time between two such calls is
- larger than the configured time, then the service is placed in
- a failed state and it will be terminated with
- <constant>SIGABRT</constant>. By setting
- <varname>Restart=</varname> to <option>on-failure</option>,
- <option>on-watchdog</option>, <option>on-abnormal</option> or
- <option>always</option>, the service will be automatically
- restarted. The time configured here will be passed to the
- executed service process in the
- <varname>WATCHDOG_USEC=</varname> environment variable. This
- allows daemons to automatically enable the keep-alive pinging
- logic if watchdog support is enabled for the service. If this
- option is used, <varname>NotifyAccess=</varname> (see below)
- should be set to open access to the notification socket
- provided by systemd. If <varname>NotifyAccess=</varname> is
- not set, it will be implicitly set to <option>main</option>.
- Defaults to 0, which disables this feature. The service can
- check whether the service manager expects watchdog keep-alive
- notifications. See
- <citerefentry><refentrytitle>sd_watchdog_enabled</refentrytitle><manvolnum>3</manvolnum></citerefentry>
- for details.
- <citerefentry><refentrytitle>sd_event_set_watchdog</refentrytitle><manvolnum>3</manvolnum></citerefentry>
- may be used to enable automatic watchdog notification support.
- </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>Restart=</varname></term>
- <listitem><para>Configures whether the service shall be
- restarted when the service process exits, is killed, or a
- timeout is reached. The service process may be the main
- service process, but it may also be one of the processes
- specified with <varname>ExecStartPre=</varname>,
- <varname>ExecStartPost=</varname>,
- <varname>ExecStop=</varname>,
- <varname>ExecStopPost=</varname>, or
- <varname>ExecReload=</varname>. When the death of the process
- is a result of systemd operation (e.g. service stop or
- restart), the service will not be restarted. Timeouts include
- missing the watchdog "keep-alive ping" deadline and a service
- start, reload, and stop operation timeouts.</para>
-
- <para>Takes one of
- <option>no</option>,
- <option>on-success</option>,
- <option>on-failure</option>,
- <option>on-abnormal</option>,
- <option>on-watchdog</option>,
- <option>on-abort</option>, or
- <option>always</option>.
- If set to <option>no</option> (the default), the service will
- not be restarted. If set to <option>on-success</option>, it
- will be restarted only when the service process exits cleanly.
- In this context, a clean exit means an exit code of 0, or one
- of the signals
- <constant>SIGHUP</constant>,
- <constant>SIGINT</constant>,
- <constant>SIGTERM</constant> or
- <constant>SIGPIPE</constant>, and
- additionally, exit statuses and signals specified in
- <varname>SuccessExitStatus=</varname>. If set to
- <option>on-failure</option>, the service will be restarted
- when the process exits with a non-zero exit code, is
- terminated by a signal (including on core dump, but excluding
- the aforementioned four signals), when an operation (such as
- service reload) times out, and when the configured watchdog
- timeout is triggered. If set to <option>on-abnormal</option>,
- the service will be restarted when the process is terminated
- by a signal (including on core dump, excluding the
- aforementioned four signals), when an operation times out, or
- when the watchdog timeout is triggered. If set to
- <option>on-abort</option>, the service will be restarted only
- if the service process exits due to an uncaught signal not
- specified as a clean exit status. If set to
- <option>on-watchdog</option>, the service will be restarted
- only if the watchdog timeout for the service expires. If set
- to <option>always</option>, the service will be restarted
- regardless of whether it exited cleanly or not, got terminated
- abnormally by a signal, or hit a timeout.</para>
-
- <table>
- <title>Exit causes and the effect of the <varname>Restart=</varname> settings on them</title>
-
- <tgroup cols='2'>
- <colspec colname='path' />
- <colspec colname='expl' />
- <thead>
- <row>
- <entry>Restart settings/Exit causes</entry>
- <entry><option>no</option></entry>
- <entry><option>always</option></entry>
- <entry><option>on-success</option></entry>
- <entry><option>on-failure</option></entry>
- <entry><option>on-abnormal</option></entry>
- <entry><option>on-abort</option></entry>
- <entry><option>on-watchdog</option></entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Clean exit code or signal</entry>
- <entry/>
- <entry>X</entry>
- <entry>X</entry>
- <entry/>
- <entry/>
- <entry/>
- <entry/>
- </row>
- <row>
- <entry>Unclean exit code</entry>
- <entry/>
- <entry>X</entry>
- <entry/>
- <entry>X</entry>
- <entry/>
- <entry/>
- <entry/>
- </row>
- <row>
- <entry>Unclean signal</entry>
- <entry/>
- <entry>X</entry>
- <entry/>
- <entry>X</entry>
- <entry>X</entry>
- <entry>X</entry>
- <entry/>
- </row>
- <row>
- <entry>Timeout</entry>
- <entry/>
- <entry>X</entry>
- <entry/>
- <entry>X</entry>
- <entry>X</entry>
- <entry/>
- <entry/>
- </row>
- <row>
- <entry>Watchdog</entry>
- <entry/>
- <entry>X</entry>
- <entry/>
- <entry>X</entry>
- <entry>X</entry>
- <entry/>
- <entry>X</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>As exceptions to the setting above, the service will not
- be restarted if the exit code or signal is specified in
- <varname>RestartPreventExitStatus=</varname> (see below).
- Also, the services will always be restarted if the exit code
- or signal is specified in
- <varname>RestartForceExitStatus=</varname> (see below).</para>
-
- <para>Setting this to <option>on-failure</option> is the
- recommended choice for long-running services, in order to
- increase reliability by attempting automatic recovery from
- errors. For services that shall be able to terminate on their
- own choice (and avoid immediate restarting),
- <option>on-abnormal</option> is an alternative choice.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>SuccessExitStatus=</varname></term>
- <listitem><para>Takes a list of exit status definitions that,
- when returned by the main service process, will be considered
- successful termination, in addition to the normal successful
- exit code 0 and the signals <constant>SIGHUP</constant>,
- <constant>SIGINT</constant>, <constant>SIGTERM</constant>, and
- <constant>SIGPIPE</constant>. Exit status definitions can
- either be numeric exit codes or termination signal names,
- separated by spaces. For example:
-
- <programlisting>SuccessExitStatus=1 2 8 SIGKILL</programlisting>
-
- ensures that exit codes 1, 2, 8 and
- the termination signal <constant>SIGKILL</constant> are
- considered clean service terminations.
- </para>
-
- <para>Note that if a process has a signal handler installed
- and exits by calling
- <citerefentry><refentrytitle>_exit</refentrytitle><manvolnum>2</manvolnum></citerefentry>
- in response to a signal, the information about the signal is
- lost. Programs should instead perform cleanup and kill
- themselves with the same signal instead. See
- <ulink url="http://www.cons.org/cracauer/sigint.html">Proper
- handling of SIGINT/SIGQUIT — How to be a proper
- program</ulink>.</para>
-
- <para>This option may appear more than once, in which case the
- list of successful exit statuses is merged. If the empty
- string is assigned to this option, the list is reset, all
- prior assignments of this option will have no
- effect.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>RestartPreventExitStatus=</varname></term>
- <listitem><para>Takes a list of exit status definitions that,
- when returned by the main service process, will prevent
- automatic service restarts, regardless of the restart setting
- configured with <varname>Restart=</varname>. Exit status
- definitions can either be numeric exit codes or termination
- signal names, and are separated by spaces. Defaults to the
- empty list, so that, by default, no exit status is excluded
- from the configured restart logic. For example:
-
- <programlisting>RestartPreventExitStatus=1 6 SIGABRT</programlisting>
-
- ensures that exit codes 1 and 6 and the termination signal
- <constant>SIGABRT</constant> will not result in automatic
- service restarting. This option may appear more than once, in
- which case the list of restart-preventing statuses is
- merged. If the empty string is assigned to this option, the
- list is reset and all prior assignments of this option will
- have no effect.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>RestartForceExitStatus=</varname></term>
- <listitem><para>Takes a list of exit status definitions that,
- when returned by the main service process, will force automatic
- service restarts, regardless of the restart setting configured
- with <varname>Restart=</varname>. The argument format is
- similar to
- <varname>RestartPreventExitStatus=</varname>.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>PermissionsStartOnly=</varname></term>
- <listitem><para>Takes a boolean argument. If true, the
- permission-related execution options, as configured with
- <varname>User=</varname> and similar options (see
- <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- for more information), are only applied to the process started
- with
- <varname>ExecStart=</varname>, and not to the various other
- <varname>ExecStartPre=</varname>,
- <varname>ExecStartPost=</varname>,
- <varname>ExecReload=</varname>,
- <varname>ExecStop=</varname>, and
- <varname>ExecStopPost=</varname>
- commands. If false, the setting is applied to all configured
- commands the same way. Defaults to false.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>RootDirectoryStartOnly=</varname></term>
- <listitem><para>Takes a boolean argument. If true, the root
- directory, as configured with the
- <varname>RootDirectory=</varname> option (see
- <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- for more information), is only applied to the process started
- with <varname>ExecStart=</varname>, and not to the various
- other <varname>ExecStartPre=</varname>,
- <varname>ExecStartPost=</varname>,
- <varname>ExecReload=</varname>, <varname>ExecStop=</varname>,
- and <varname>ExecStopPost=</varname> commands. If false, the
- setting is applied to all configured commands the same way.
- Defaults to false.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>NonBlocking=</varname></term>
- <listitem><para>Set the <constant>O_NONBLOCK</constant> flag
- for all file descriptors passed via socket-based activation.
- If true, all file descriptors >= 3 (i.e. all except stdin,
- stdout, and stderr) will have the
- <constant>O_NONBLOCK</constant> flag set and hence are in
- non-blocking mode. This option is only useful in conjunction
- with a socket unit, as described in
- <citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
- Defaults to false.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>NotifyAccess=</varname></term>
- <listitem><para>Controls access to the service status
- notification socket, as accessible via the
- <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry>
- call. Takes one of <option>none</option> (the default),
- <option>main</option> or <option>all</option>. If
- <option>none</option>, no daemon status updates are accepted
- from the service processes, all status update messages are
- ignored. If <option>main</option>, only service updates sent
- from the main process of the service are accepted. If
- <option>all</option>, all services updates from all members of
- the service's control group are accepted. This option should
- be set to open access to the notification socket when using
- <varname>Type=notify</varname> or
- <varname>WatchdogSec=</varname> (see above). If those options
- are used but <varname>NotifyAccess=</varname> is not
- configured, it will be implicitly set to
- <option>main</option>.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>Sockets=</varname></term>
- <listitem><para>Specifies the name of the socket units this
- service shall inherit socket file descriptors from when the
- service is started. Normally, it should not be necessary to use
- this setting, as all socket file descriptors whose unit shares
- the same name as the service (subject to the different unit
- name suffix of course) are passed to the spawned
- process.</para>
-
- <para>Note that the same socket file descriptors may be passed
- to multiple processes simultaneously. Also note that a
- different service may be activated on incoming socket traffic
- than the one which is ultimately configured to inherit the
- socket file descriptors. Or, in other words: the
- <varname>Service=</varname> setting of
- <filename>.socket</filename> units does not have to match the
- inverse of the <varname>Sockets=</varname> setting of the
- <filename>.service</filename> it refers to.</para>
-
- <para>This option may appear more than once, in which case the
- list of socket units is merged. If the empty string is
- assigned to this option, the list of sockets is reset, and all
- prior uses of this setting will have no
- effect.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>FailureAction=</varname></term>
- <listitem><para>Configure the action to take when the service enters a failed state. Takes the same values as
- the unit setting <varname>StartLimitAction=</varname> and executes the same actions (see
- <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>). Defaults to
- <option>none</option>. </para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>FileDescriptorStoreMax=</varname></term>
- <listitem><para>Configure how many file descriptors may be
- stored in the service manager for the service using
- <citerefentry><refentrytitle>sd_pid_notify_with_fds</refentrytitle><manvolnum>3</manvolnum></citerefentry>'s
- <literal>FDSTORE=1</literal> messages. This is useful for
- implementing service restart schemes where the state is
- serialized to <filename>/run</filename> and the file
- descriptors passed to the service manager, to allow restarts
- without losing state. Defaults to 0, i.e. no file descriptors
- may be stored in the service manager. All file
- descriptors passed to the service manager from a specific
- service are passed back to the service's main process on the
- next service restart. Any file descriptors passed to the
- service manager are automatically closed when POLLHUP or
- POLLERR is seen on them, or when the service is fully stopped
- and no job is queued or being executed for it.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>USBFunctionDescriptors=</varname></term>
- <listitem><para>Configure the location of a file containing
- <ulink
- url="https://www.kernel.org/doc/Documentation/usb/functionfs.txt">USB
- FunctionFS</ulink> descriptors, for implementation of USB
- gadget functions. This is used only in conjunction with a
- socket unit with <varname>ListenUSBFunction=</varname>
- configured. The contents of this file are written to the
- <filename>ep0</filename> file after it is
- opened.</para></listitem>
- </varlistentry>
-
- <varlistentry>
- <term><varname>USBFunctionStrings=</varname></term>
- <listitem><para>Configure the location of a file containing
- USB FunctionFS strings. Behavior is similar to
- <varname>USBFunctionDescriptors=</varname>
- above.</para></listitem>
- </varlistentry>
-
- </variablelist>
-
- <para>Check
- <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- and
- <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- for more settings.</para>
-
- </refsect1>
-
- <refsect1>
- <title>Command lines</title>
-
- <para>This section describes command line parsing and
- variable and specifier substitutions for
- <varname>ExecStart=</varname>,
- <varname>ExecStartPre=</varname>,
- <varname>ExecStartPost=</varname>,
- <varname>ExecReload=</varname>,
- <varname>ExecStop=</varname>, and
- <varname>ExecStopPost=</varname> options.</para>
-
- <para>Multiple command lines may be concatenated in a single
- directive by separating them with semicolons (these semicolons
- must be passed as separate words). Lone semicolons may be escaped
- as <literal>\;</literal>.</para>
-
- <para>Each command line is split on whitespace, with the first
- item being the command to execute, and the subsequent items being
- the arguments. Double quotes ("...") and single quotes ('...') may
- be used, in which case everything until the next matching quote
- becomes part of the same argument. C-style escapes are also
- supported. The table below contains the list of allowed escape
- patterns. Only patterns which match the syntax in the table are
- allowed; others will result in an error, and must be escaped by
- doubling the backslash. Quotes themselves are removed after
- parsing and escape sequences substituted. In addition, a trailing
- backslash (<literal>\</literal>) may be used to merge lines.
- </para>
-
- <para>This syntax is intended to be very similar to shell syntax,
- but only the meta-characters and expansions described in the
- following paragraphs are understood. Specifically, redirection
- using
- <literal>&lt;</literal>,
- <literal>&lt;&lt;</literal>,
- <literal>&gt;</literal>, and
- <literal>&gt;&gt;</literal>, pipes using
- <literal>|</literal>, running programs in the background using
- <literal>&amp;</literal>, and <emphasis>other elements of shell
- syntax are not supported</emphasis>.</para>
-
- <para>The command to execute must be an absolute path name. It may
- contain spaces, but control characters are not allowed.</para>
-
- <para>The command line accepts <literal>%</literal> specifiers as
- described in
- <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
- Note that the first argument of the command line (i.e. the program
- to execute) may not include specifiers.</para>
-
- <para>Basic environment variable substitution is supported. Use
- <literal>${FOO}</literal> as part of a word, or as a word of its
- own, on the command line, in which case it will be replaced by the
- value of the environment variable including all whitespace it
- contains, resulting in a single argument. Use
- <literal>$FOO</literal> as a separate word on the command line, in
- which case it will be replaced by the value of the environment
- variable split at whitespace, resulting in zero or more arguments.
- For this type of expansion, quotes are respected when splitting
- into words, and afterwards removed.</para>
-
- <para>Example:</para>
-
- <programlisting>Environment="ONE=one" 'TWO=two two'
-ExecStart=/bin/echo $ONE $TWO ${TWO}</programlisting>
-
- <para>This will execute <command>/bin/echo</command> with four
- arguments: <literal>one</literal>, <literal>two</literal>,
- <literal>two</literal>, and <literal>two two</literal>.</para>
-
- <para>Example:</para>
- <programlisting>Environment=ONE='one' "TWO='two two' too" THREE=
-ExecStart=/bin/echo ${ONE} ${TWO} ${THREE}
-ExecStart=/bin/echo $ONE $TWO $THREE</programlisting>
- <para>This results in <filename>echo</filename> being
- called twice, the first time with arguments
- <literal>'one'</literal>,
- <literal>'two two' too</literal>, <literal></literal>,
- and the second time with arguments
- <literal>one</literal>, <literal>two two</literal>,
- <literal>too</literal>.
- </para>
-
- <para>To pass a literal dollar sign, use <literal>$$</literal>.
- Variables whose value is not known at expansion time are treated
- as empty strings. Note that the first argument (i.e. the program
- to execute) may not be a variable.</para>
-
- <para>Variables to be used in this fashion may be defined through
- <varname>Environment=</varname> and
- <varname>EnvironmentFile=</varname>. In addition, variables listed
- in the section "Environment variables in spawned processes" in
- <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
- which are considered "static configuration", may be used (this
- includes e.g. <varname>$USER</varname>, but not
- <varname>$TERM</varname>).</para>
-
- <para>Note that shell command lines are not directly supported. If
- shell command lines are to be used, they need to be passed
- explicitly to a shell implementation of some kind. Example:</para>
- <programlisting>ExecStart=/bin/sh -c 'dmesg | tac'</programlisting>
-
- <para>Example:</para>
-
- <programlisting>ExecStart=/bin/echo one ; /bin/echo "two two"</programlisting>
-
- <para>This will execute <command>/bin/echo</command> two times,
- each time with one argument: <literal>one</literal> and
- <literal>two two</literal>, respectively. Because two commands are
- specified, <varname>Type=oneshot</varname> must be used.</para>
-
- <para>Example:</para>
-
- <programlisting>ExecStart=/bin/echo / &gt;/dev/null &amp; \; \
-/bin/ls</programlisting>
-
- <para>This will execute <command>/bin/echo</command>
- with five arguments: <literal>/</literal>,
- <literal>&gt;/dev/null</literal>,
- <literal>&amp;</literal>, <literal>;</literal>, and
- <literal>/bin/ls</literal>.</para>
-
- <table>
- <title>C escapes supported in command lines and environment variables</title>
- <tgroup cols='2'>
- <colspec colname='escape' />
- <colspec colname='meaning' />
- <thead>
- <row>
- <entry>Literal</entry>
- <entry>Actual value</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry><literal>\a</literal></entry>
- <entry>bell</entry>
- </row>
- <row>
- <entry><literal>\b</literal></entry>
- <entry>backspace</entry>
- </row>
- <row>
- <entry><literal>\f</literal></entry>
- <entry>form feed</entry>
- </row>
- <row>
- <entry><literal>\n</literal></entry>
- <entry>newline</entry>
- </row>
- <row>
- <entry><literal>\r</literal></entry>
- <entry>carriage return</entry>
- </row>
- <row>
- <entry><literal>\t</literal></entry>
- <entry>tab</entry>
- </row>
- <row>
- <entry><literal>\v</literal></entry>
- <entry>vertical tab</entry>
- </row>
- <row>
- <entry><literal>\\</literal></entry>
- <entry>backslash</entry>
- </row>
- <row>
- <entry><literal>\"</literal></entry>
- <entry>double quotation mark</entry>
- </row>
- <row>
- <entry><literal>\'</literal></entry>
- <entry>single quotation mark</entry>
- </row>
- <row>
- <entry><literal>\s</literal></entry>
- <entry>space</entry>
- </row>
- <row>
- <entry><literal>\x<replaceable>xx</replaceable></literal></entry>
- <entry>character number <replaceable>xx</replaceable> in hexadecimal encoding</entry>
- </row>
- <row>
- <entry><literal>\<replaceable>nnn</replaceable></literal></entry>
- <entry>character number <replaceable>nnn</replaceable> in octal encoding</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </refsect1>
-
- <refsect1>
- <title>Examples</title>
-
- <example>
- <title>Simple service</title>
-
- <para>The following unit file creates a service that will
- execute <filename>/usr/sbin/foo-daemon</filename>. Since no
- <varname>Type=</varname> is specified, the default
- <varname>Type=</varname><option>simple</option> will be assumed.
- systemd will assume the unit to be started immediately after the
- program has begun executing.</para>
-
- <programlisting>[Unit]
-Description=Foo
-
-[Service]
-ExecStart=/usr/sbin/foo-daemon
-
-[Install]
-WantedBy=multi-user.target</programlisting>
-
- <para>Note that systemd assumes here that the process started by
- systemd will continue running until the service terminates. If
- the program daemonizes itself (i.e. forks), please use
- <varname>Type=</varname><option>forking</option> instead.</para>
-
- <para>Since no <varname>ExecStop=</varname> was specified,
- systemd will send SIGTERM to all processes started from this
- service, and after a timeout also SIGKILL. This behavior can be
- modified, see
- <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- for details.</para>
-
- <para>Note that this unit type does not include any type of
- notification when a service has completed initialization. For
- this, you should use other unit types, such as
- <varname>Type=</varname><option>notify</option> if the service
- understands systemd's notification protocol,
- <varname>Type=</varname><option>forking</option> if the service
- can background itself or
- <varname>Type=</varname><option>dbus</option> if the unit
- acquires a DBus name once initialization is complete. See
- below.</para>
- </example>
-
- <example>
- <title>Oneshot service</title>
-
- <para>Sometimes, units should just execute an action without
- keeping active processes, such as a filesystem check or a
- cleanup action on boot. For this,
- <varname>Type=</varname><option>oneshot</option> exists. Units
- of this type will wait until the process specified terminates
- and then fall back to being inactive. The following unit will
- perform a cleanup action:</para>
-
- <programlisting>[Unit]
-Description=Cleanup old Foo data
-
-[Service]
-Type=oneshot
-ExecStart=/usr/sbin/foo-cleanup
-
-[Install]
-WantedBy=multi-user.target</programlisting>
-
- <para>Note that systemd will consider the unit to be in the
- state "starting" until the program has terminated, so ordered
- dependencies will wait for the program to finish before starting
- themselves. The unit will revert to the "inactive" state after
- the execution is done, never reaching the "active" state. That
- means another request to start the unit will perform the action
- again.</para>
-
- <para><varname>Type=</varname><option>oneshot</option> are the
- only service units that may have more than one
- <varname>ExecStart=</varname> specified. They will be executed
- in order until either they are all successful or one of them
- fails.</para>
- </example>
-
- <example>
- <title>Stoppable oneshot service</title>
-
- <para>Similarly to the oneshot services, there are sometimes
- units that need to execute a program to set up something and
- then execute another to shut it down, but no process remains
- active while they are considered "started". Network
- configuration can sometimes fall into this category. Another use
- case is if a oneshot service shall not be executed each time
- when they are pulled in as a dependency, but only the first
- time.</para>
-
- <para>For this, systemd knows the setting
- <varname>RemainAfterExit=</varname><option>yes</option>, which
- causes systemd to consider the unit to be active if the start
- action exited successfully. This directive can be used with all
- types, but is most useful with
- <varname>Type=</varname><option>oneshot</option> and
- <varname>Type=</varname><option>simple</option>. With
- <varname>Type=</varname><option>oneshot</option>, systemd waits
- until the start action has completed before it considers the
- unit to be active, so dependencies start only after the start
- action has succeeded. With
- <varname>Type=</varname><option>simple</option>, dependencies
- will start immediately after the start action has been
- dispatched. The following unit provides an example for a simple
- static firewall.</para>
-
- <programlisting>[Unit]
-Description=Simple firewall
-
-[Service]
-Type=oneshot
-RemainAfterExit=yes
-ExecStart=/usr/local/sbin/simple-firewall-start
-ExecStop=/usr/local/sbin/simple-firewall-stop
-
-[Install]
-WantedBy=multi-user.target</programlisting>
-
- <para>Since the unit is considered to be running after the start
- action has exited, invoking <command>systemctl start</command>
- on that unit again will cause no action to be taken.</para>
- </example>
-
- <example>
- <title>Traditional forking services</title>
-
- <para>Many traditional daemons/services background (i.e. fork,
- daemonize) themselves when starting. Set
- <varname>Type=</varname><option>forking</option> in the
- service's unit file to support this mode of operation. systemd
- will consider the service to be in the process of initialization
- while the original program is still running. Once it exits
- successfully and at least a process remains (and
- <varname>RemainAfterExit=</varname><option>no</option>), the
- service is considered started.</para>
-
- <para>Often, a traditional daemon only consists of one process.
- Therefore, if only one process is left after the original
- process terminates, systemd will consider that process the main
- process of the service. In that case, the
- <varname>$MAINPID</varname> variable will be available in
- <varname>ExecReload=</varname>, <varname>ExecStop=</varname>,
- etc.</para>
-
- <para>In case more than one process remains, systemd will be
- unable to determine the main process, so it will not assume
- there is one. In that case, <varname>$MAINPID</varname> will not
- expand to anything. However, if the process decides to write a
- traditional PID file, systemd will be able to read the main PID
- from there. Please set <varname>PIDFile=</varname> accordingly.
- Note that the daemon should write that file before finishing
- with its initialization. Otherwise, systemd might try to read the
- file before it exists.</para>
-
- <para>The following example shows a simple daemon that forks and
- just starts one process in the background:</para>
-
- <programlisting>[Unit]
-Description=Some simple daemon
-
-[Service]
-Type=forking
-ExecStart=/usr/sbin/my-simple-daemon -d
-
-[Install]
-WantedBy=multi-user.target</programlisting>
-
- <para>Please see
- <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- for details on how you can influence the way systemd terminates
- the service.</para>
- </example>
-
- <example>
- <title>DBus services</title>
-
- <para>For services that acquire a name on the DBus system bus,
- use <varname>Type=</varname><option>dbus</option> and set
- <varname>BusName=</varname> accordingly. The service should not
- fork (daemonize). systemd will consider the service to be
- initialized once the name has been acquired on the system bus.
- The following example shows a typical DBus service:</para>
-
- <programlisting>[Unit]
-Description=Simple DBus service
-
-[Service]
-Type=dbus
-BusName=org.example.simple-dbus-service
-ExecStart=/usr/sbin/simple-dbus-service
-
-[Install]
-WantedBy=multi-user.target</programlisting>
-
- <para>For <emphasis>bus-activatable</emphasis> services, do not
- include a <literal>[Install]</literal> section in the systemd
- service file, but use the <varname>SystemdService=</varname>
- option in the corresponding DBus service file, for example
- (<filename>/usr/share/dbus-1/system-services/org.example.simple-dbus-service.service</filename>):</para>
-
- <programlisting>[D-BUS Service]
-Name=org.example.simple-dbus-service
-Exec=/usr/sbin/simple-dbus-service
-User=root
-SystemdService=simple-dbus-service.service</programlisting>
-
- <para>Please see
- <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- for details on how you can influence the way systemd terminates
- the service.</para>
- </example>
-
- <example>
- <title>Services that notify systemd about their initialization</title>
-
- <para><varname>Type=</varname><option>simple</option> services
- are really easy to write, but have the major disadvantage of
- systemd not being able to tell when initialization of the given
- service is complete. For this reason, systemd supports a simple
- notification protocol that allows daemons to make systemd aware
- that they are done initializing. Use
- <varname>Type=</varname><option>notify</option> for this. A
- typical service file for such a daemon would look like
- this:</para>
-
- <programlisting>[Unit]
-Description=Simple notifying service
-
-[Service]
-Type=notify
-ExecStart=/usr/sbin/simple-notifying-service
-
-[Install]
-WantedBy=multi-user.target</programlisting>
-
- <para>Note that the daemon has to support systemd's notification
- protocol, else systemd will think the service has not started yet
- and kill it after a timeout. For an example of how to update
- daemons to support this protocol transparently, take a look at
- <citerefentry><refentrytitle>sd_notify</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
- systemd will consider the unit to be in the 'starting' state
- until a readiness notification has arrived.</para>
-
- <para>Please see
- <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>
- for details on how you can influence the way systemd terminates
- the service.</para>
- </example>
- </refsect1>
-
- <refsect1>
- <title>See Also</title>
- <para>
- <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
- <citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
- <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
- <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
- <citerefentry><refentrytitle>systemd.resource-control</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
- <citerefentry><refentrytitle>systemd.kill</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
- <citerefentry><refentrytitle>systemd.directives</refentrytitle><manvolnum>7</manvolnum></citerefentry>
- </para>
- </refsect1>
-
-</refentry>