[systemd-devel] ExecStart vs ExecStartPre

Lennart Poettering lennart at poettering.net
Thu May 28 03:58:02 PDT 2015

On Tue, 26.05.15 14:12, Steven Noonan (steven at uplinklabs.net) 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

As mentioned in Christian's reply: multiple ExecStart= lines are only
available for Type=oneshot services. Other service types do not
support that.

> From my read of the systemd.service man page, they appear to have the
> same behavior in the common use case.

For services that do not have Type=oneshot it is the
ExecStart= process that defines the runtime of the service unit. Only
when it signalled that its initialization is complete systemd
considers the service fully up, and when it dies it takes that as
indication that the service is terminating now. 

Also, each time an ExecStartPre= service dies systemd will kill all
remaining processes in the cgroup. However, especially for
Type=forking services this is different for ExecStart=.

Then, among other things, while the process invoked with ExecStart= is
up things like watchdog support and so on are active, while on
ExecStartPre= and so on a timeout is applied.

> The only difference I can see is that groups of ExecStartPre and
> ExecStart groups can be rearranged. That is, you could have an
> ExecStartPre line *after* the ExecStart line in the file, and the
> ExecStartPre would still be executed first. But the ordering of
> multiple ExecStart (or ExecStartPre) lines in a single systemd.service
> file matters, because it has explicit ordering as written in the file.
> Why would someone choose one over the other? What differences am I missing?

ExecStart= should be the main process of a daemon. Defining its
life-time, be long-lived. ExecStartPre= however should only be
short-lived, preparatory processes.


Lennart Poettering, Red Hat

More information about the systemd-devel mailing list