diff --git a/man/systemd.service.xml b/man/systemd.service.xml
index b9a2f8d82f..dbc82edbd4 100644
--- a/man/systemd.service.xml
+++ b/man/systemd.service.xml
@@ -352,125 +352,36 @@
ExecStart=Commands with their
arguments that are executed when this
- service is started. For each of the
- specified commands, the first argument
- must be an absolute and literal path
- to an executable.
+ service is started. The value is split
+ into zero or more command lines is
+ according to the rules described below
+ (see section "Command Lines" below).
+
When Type is
not , only one
command may and must be given. When
Type=oneshot is
- used, none or more than one command
- may be specified. Multiple command
- lines may be concatenated in a single
- directive by separating them with
- semicolons (these semicolons must be
- passed as separate
- words). Alternatively, this directive
- may be specified more than once with
- the same effect. Lone semicolons may
- be escaped as
- \;. 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
+ used, zero or more commands may be
+ specified. This can 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
ExecStart= is
specified, then the service must have
RemainAfterExit=yes
set.
- 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. Quotes themselves are
- removed after parsing. In addition, a
- trailing backslash
- (\) may be used to
- merge lines. 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
- <,
- <<,
- >, and
- >>, pipes
- using |, and
- running programs in the background
- using &
- and other elements of shell
- syntax are not supported.
-
-
- 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 -), other lines
- are not executed, and the unit is
- considered failed.
-
- Unless
- Type=forking is
- set, the process started via this
- command line will be considered the
- main process of the daemon.
-
- The command line accepts
- % specifiers as
- described in
- systemd.unit5.
- Note that the first argument of the
- command line (i.e. the program to
- execute) may not include
- specifiers.
-
- Basic environment variable
- substitution is supported. Use
- ${FOO} 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
- $FOO 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. To pass a literal dollar
- sign, use $$.
- 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.
-
- Variables to be used in this
- fashion may be defined through
- Environment= and
- EnvironmentFile=.
- In addition, variables listed in the
- section "Environment variables in
- spawned processes" in
- systemd.exec5,
- which are considered "static
- configuration", may be used (this includes
- e.g. $USER, but not
- $TERM).
-
- Optionally, if the absolute file
- name is prefixed with
+ For each of the specified
+ commands, the first argument must be
+ an absolute and literal path to an
+ executable. Optionally, if the
+ absolute file name is prefixed with
@, the second token
will be passed as
argv[0] to the
@@ -480,51 +391,27 @@
-, 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 both
- - and
+ abnormal exit due to signal) is
+ ignored and considered success. If
+ both - and
@ are used, they
can appear in either order.
- Note that this setting does not
- directly support shell command
- lines. If shell command lines are to
- be used, they need to be passed
- explicitly to a shell implementation
- of some kind. Example:
- ExecStart=/bin/sh -c 'dmesg | tac'
- Example:
- ExecStart=/bin/echo one ; /bin/echo "two two"
- This will execute
- /bin/echo two
- times, each time with one argument:
- one and
- two two,
- respectively. Because two commands are
- specified,
- Type=oneshot must
- be used.
+ 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 -), other
+ lines are not executed, and the unit
+ is considered failed.
- Example:
- ExecStart=/bin/echo / >/dev/null & \; \
-/bin/ls
- This will execute
- /bin/echo with five
- arguments: /,
- >/dev/null,
- &,
- ;, and
- /bin/ls.
+ Unless
+ Type=forking is
+ set, the process started via this
+ command line will be considered the
+ main process of the daemon.
- Example:
- Environment="ONE=one" 'TWO=two two'
-ExecStart=/bin/echo $ONE $TWO ${TWO}
- This will execute
- /bin/echo with four
- arguments: one,
- two,
- two, and
- two two.
@@ -1273,6 +1160,117 @@ ExecStart=/bin/echo $ONE $TWO ${TWO}
+
+ Command lines
+
+ This section describes command line parsing and
+ variable and specifier substitions for
+ ExecStart=,
+ ExecStartPre=,
+ ExecStartPost=,
+ ExecReload=,
+ ExecStop=, and
+ ExecStopPost= options.
+
+ 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
+ \;.
+
+ 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. Quotes themselves
+ are removed after parsing. In addition, a trailing
+ backslash (\) may be used to merge
+ lines.
+
+ 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
+ <, <<,
+ >, and
+ >>, pipes using
+ |, running programs in the
+ background using &, and
+ other elements of shell syntax are not
+ supported.
+
+ The command line accepts %
+ specifiers as described in
+ systemd.unit5.
+ Note that the first argument of the command line
+ (i.e. the program to execute) may not include
+ specifiers.
+
+ Basic environment variable substitution is
+ supported. Use ${FOO} 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
+ $FOO 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. To pass a literal
+ dollar sign, use $$. 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.
+
+ Variables to be used in this fashion may be
+ defined through Environment= and
+ EnvironmentFile=. In addition,
+ variables listed in the section "Environment variables
+ in spawned processes" in
+ systemd.exec5,
+ which are considered "static configuration", may be
+ used (this includes e.g. $USER, but
+ not $TERM).
+
+ 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:
+ ExecStart=/bin/sh -c 'dmesg | tac'
+
+ Example:
+
+ ExecStart=/bin/echo one ; /bin/echo "two two"
+
+ This will execute /bin/echo
+ two times, each time with one argument:
+ one and two two,
+ respectively. Because two commands are specified,
+ Type=oneshot must be used.
+
+ Example:
+
+ ExecStart=/bin/echo / >/dev/null & \; \
+/bin/ls
+
+ This will execute /bin/echo
+ with five arguments: /,
+ >/dev/null,
+ &, ;, and
+ /bin/ls.
+
+ Example:
+
+ Environment="ONE=one" 'TWO=two two'
+ExecStart=/bin/echo $ONE $TWO ${TWO}
+
+ This will execute /bin/echo
+ with four arguments: one,
+ two, two, and
+ two two.
+
+
See Also