[systemd-devel] ExecStart vs ExecStartPre

Christian Seiler christian at iwakd.de
Tue May 26 14:26:11 PDT 2015

On 05/26/2015 11:12 PM, Steven Noonan wrote:
> Hi there,
> I'm wondering what the functional difference is between doing:
> ExecStartPre=/bin/foo
> ExecStart=/bin/bar
> and
> ExecStart=/bin/foo
> ExecStart=/bin/bar
> From my read of the systemd.service man page, they appear to have the
> same behavior in the common use case.

Three differences come directly to mind:

 - If you have unit of type that is NOT oneshot (simple, forking,
   etc.), you can have only a single ExecStart= line, not multiple
   ones. The main service process must be started in ExecStart=
   and not ExecStartPre=.

 - Even in Type=oneshot units you must have at least one ExecStart=
   line (but can in any case have an arbitrary amount of ExecStartPre=
   lines, even zero).

 - If you set PermissionsStartOnly= or RootDirectoryStartOnly=, then
   certain settings will be applied to ExecStart= but not to
   ExecStartPre= (see manpage for details).

(There are probably more.)

Generally speaking, I follow the following guidelines when writing

 - Type=oneshot: I typically use only ExecStart= and only use
   ExecStartPre= if I have to use *StartOnly=true (see above).

 - other types: ExecStart= to start the service proper, ExecStartPre=
   for preparatory things (like generating a default config if none
   is already present or something along those lines)

But it really depends on your use case and as always YMMV.

Hope that helps!


More information about the systemd-devel mailing list