65878a
From 1e09f64d4735563be7b7f7e98d727ba15fe6a523 Mon Sep 17 00:00:00 2001
65878a
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
65878a
Date: Sat, 14 Dec 2013 17:21:55 -0500
65878a
Subject: [PATCH] man: beef up ExecStart description
65878a
65878a
We have lots of questions from people who assume that shell syntax works
65878a
here, so let's be very explicit what is allowed and what is not. A few
65878a
examples should also help.
65878a
65878a
http://bugs.debian.org/732156
65878a
---
65878a
 man/systemd.service.xml | 97 ++++++++++++++++++++++++++++++++++++++++---------
65878a
 1 file changed, 80 insertions(+), 17 deletions(-)
65878a
65878a
diff --git a/man/systemd.service.xml b/man/systemd.service.xml
65878a
index 3f31c11..ca297ba 100644
65878a
--- a/man/systemd.service.xml
65878a
+++ b/man/systemd.service.xml
65878a
@@ -305,9 +305,10 @@
65878a
                                 <term><varname>ExecStart=</varname></term>
65878a
                                 <listitem><para>Commands with their
65878a
                                 arguments that are executed when this
65878a
-                                service is started. The first
65878a
-                                argument must be an absolute path
65878a
-                                name.</para>
65878a
+                                service is started. For each of the
65878a
+                                specified commands, the first argument
65878a
+                                must be an absolute and literal path
65878a
+                                to an executable.</para>
65878a
 
65878a
                                 <para>When <varname>Type</varname> is
65878a
                                 not <option>oneshot</option>, only one
65878a
@@ -332,6 +333,35 @@
65878a
                                 prior assignments of this option will
65878a
                                 have no effect.</para>
65878a
 
65878a
+                                <para>Each command line is split on
65878a
+                                whitespace, with the first item being
65878a
+                                the command to execute, and the
65878a
+                                subsequent items being the arguments.
65878a
+                                Double quotes ("...") and single
65878a
+                                quotes ('...') may be used, in which
65878a
+                                case everything until the next
65878a
+                                matching quote becomes part of the
65878a
+                                same argument. Quotes themselves are
65878a
+                                removed after parsing. In addition, a
65878a
+                                trailing backslash
65878a
+                                (<literal>\</literal>) may be used to
65878a
+                                merge lines. This syntax is intended
65878a
+                                to be very similar to shell syntax,
65878a
+                                but only the meta-characters and
65878a
+                                expansions described in the following
65878a
+                                paragraphs are understood.
65878a
+                                Specifically, redirection using
65878a
+                                <literal><</literal>,
65878a
+                                <literal><<</literal>,
65878a
+                                <literal>></literal>, and
65878a
+                                <literal>>></literal>, pipes
65878a
+                                using <literal>|</literal>, and
65878a
+                                running programs in the background
65878a
+                                using <literal>&</literal>
65878a
+                                and <emphasis>other elements of shell
65878a
+                                syntax are not supported</emphasis>.
65878a
+                                </para>
65878a
+
65878a
                                 <para>If more than one command is
65878a
                                 specified, the commands are invoked
65878a
                                 one by one sequentially in the order
65878a
@@ -350,10 +380,11 @@
65878a
                                 <para>The command line accepts
65878a
                                 <literal>%</literal> specifiers as
65878a
                                 described in
65878a
-                                <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>. Note
65878a
-                                that the first argument of the command
65878a
-                                line (i.e. the program to execute) may
65878a
-                                not include specifiers.</para>
65878a
+                                <citerefentry><refentrytitle>systemd.unit</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
65878a
+                                Note that the first argument of the
65878a
+                                command line (i.e. the program to
65878a
+                                execute) may not include
65878a
+                                specifiers.</para>
65878a
 
65878a
                                 <para>Basic environment variable
65878a
                                 substitution is supported. Use
65878a
@@ -372,9 +403,7 @@
65878a
                                 more arguments. To pass literal dollar sign
65878a
                                 use <literal>$$</literal>. Note that the first
65878a
                                 argument (i.e. the program to execute)
65878a
-                                may not be a variable, since it must
65878a
-                                be a literal and absolute path
65878a
-                                name.</para>
65878a
+                                may not be a variable.</para>
65878a
 
65878a
                                 <para>Optionally, if the absolute file
65878a
                                 name is prefixed with
65878a
@@ -402,13 +431,47 @@
65878a
                                 <programlisting>ExecStart=/bin/sh -c 'dmesg | tac'
65878a
                                 </programlisting>
65878a
 
65878a
-                                <para>For services run by a user
65878a
-                                instance of systemd the special
65878a
-                                environment variable
65878a
-                                <varname>$MANAGERPID</varname> is set
65878a
-                                to the PID of the systemd
65878a
-                                instance.</para>
65878a
-                                </listitem>
65878a
+                                <para>Only select environment variables
65878a
+                                are set for executed commands. See
65878a
+                                <citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>.
65878a
+                                </para>
65878a
+
65878a
+                                <para>Example:</para>
65878a
+                                <programlisting>ExecStart=/bin/echo one ; /bin/echo "two two"
65878a
+                                </programlisting>
65878a
+                                <para>This will execute
65878a
+                                <command>/bin/echo</command> two
65878a
+                                times, each time with one argument,
65878a
+                                <literal>one</literal> and
65878a
+                                <literal>two two</literal>,
65878a
+                                respectively. Since two commands are
65878a
+                                specified
65878a
+                                <varname>Type=oneshot</varname> must
65878a
+                                be used.</para>
65878a
+
65878a
+                                <para>Example:</para>
65878a
+                                <programlisting>ExecStart=/bin/echo / >/dev/null & \; \
65878a
+/bin/ls
65878a
+                                </programlisting>
65878a
+                                <para>This will execute
65878a
+                                <command>/bin/echo</command> with five
65878a
+                                arguments: <literal>/</literal>,
65878a
+                                <literal>>/dev/null</literal>,
65878a
+                                <literal>&</literal>,
65878a
+                                <literal>;</literal>, and
65878a
+                                <literal>/bin/ls</literal>.</para>
65878a
+
65878a
+                                <para>Example:</para>
65878a
+                                <programlisting>Environment="ONE=one" 'TWO=two two'
65878a
+ExecStart=/bin/echo $ONE $TWO ${TWO}
65878a
+                                </programlisting>
65878a
+                                <para>This will execute
65878a
+                                <command>/bin/echo</command> with four
65878a
+                                arguments: <literal>one</literal>,
65878a
+                                <literal>two</literal>,
65878a
+                                <literal>two</literal>, and
65878a
+                                <literal>two two</literal>.</para>
65878a
+                              </listitem>
65878a
                         </varlistentry>
65878a
 
65878a
                         <varlistentry>