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