From ec6039bc08f8e77f92427afec048e4f8ac4b81a8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 14 Dec 2013 17:21:55 -0500 Subject: [PATCH] man: beef up ExecStart description We have lots of questions from people who assume that shell syntax works here, so let's be very explicit what is allowed and what is not. A few examples should also help. http://bugs.debian.org/732156 --- man/systemd.service.xml | 97 +++++++++++++++++++++++++++++++++-------- 1 file changed, 80 insertions(+), 17 deletions(-) diff --git a/man/systemd.service.xml b/man/systemd.service.xml index 22c0d5ae9..103c495fb 100644 --- a/man/systemd.service.xml +++ b/man/systemd.service.xml @@ -305,9 +305,10 @@ ExecStart= Commands with their arguments that are executed when this - service is started. The first - argument must be an absolute path - name. + service is started. For each of the + specified commands, the first argument + must be an absolute and literal path + to an executable. When Type is not , only one @@ -332,6 +333,35 @@ prior assignments of this option will have no effect. + 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 one by one sequentially in the order @@ -350,10 +380,11 @@ 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. + 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 @@ -372,9 +403,7 @@ more arguments. To pass a literal dollar sign, use $$. Note that the first argument (i.e. the program to execute) - may not be a variable, since it must - be a literal and absolute path - name. + may not be a variable. Optionally, if the absolute file name is prefixed with @@ -402,13 +431,47 @@ ExecStart=/bin/sh -c 'dmesg | tac' - For services run by a user - instance of systemd the special - environment variable - $MANAGERPID is set - to the PID of the systemd - instance. - + Only select environment variables + are set for executed commands. See + systemd.exec5. + + + 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. Since 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. + -- 2.30.2