Systemd – Delay Service if File Exists

servicessystemd

I want to delay the start of a service if a file exists (instead of fail the service if the file exist, as with ConditionPathExists=) but did not find anything in unit documentation

Is it technically possible with systemd ?
How ?

Best Answer

using just one unit

Put TimeoutStartSec=infinity in the unit file and configure ExecStart= with a script like

#! /bin/bash

TIMEOUT=1000

test -f /path/to/testfile && sleep "$TIMEOUT"

exec /path/to/service/binary plus arguments

This cannot be done (in a useful way) with ExecStartPre=, see man systemd.service:

Note that ExecStartPre= may not be used to start long-running processes. All processes forked off by processes invoked via ExecStartPre= will be killed before the next service process is run.

using a helper unit

If you want to do this with systemd "alone" then you can create a helper unit check_and_wait.target. This one gets the entries

# check_and_wait.target
[Unit]
TimeoutStartSec=infinity
ConditionPathExists=/path/to/testfile
ExecStart=/usr/bin/sleep 1000
RemainAfterExit=yes

The main unit gets these entries:

Wants=check_and_wait.target
After=check_and_wait.target
Related Question