[systemd-devel] "semaphore" for .timer-triggered run

Lennart Poettering lennart at poettering.net
Tue Aug 27 10:55:59 UTC 2019


On Fr, 02.08.19 13:24, Johannes Ernst (johannes.ernst at gmail.com) wrote:

> I have a oneshot .service (certbot) that is run by its .timer with:
>
> OnCalendar=daily
> RandomizedDelaySec=1day
>
> I also have a sometimes long-running script that may modify the same
> data. So the script and the oneshot service should never run at the
> same time.
>
> Is there a good systemd pattern for some kind of semaphore-like
> thing that will delay the execution of the oneshot service and try
> again when the script is done running?
>
> I could skip execution, but then I miss an entire day until the
> service is run again -- I’d prefer it if it tried again a few
> minutes later. Or I could poll for some flag before running the main
> part of the service. Wondering whether there something more
> systemd-native.

Maybe change the service program invoked by the timer unit to use file
locking of some kind early on. I mean, if you have shared data on disk
and want to synchronize access to it then a file lock is the concept
of choice really. If this is a proper program (i.e. not a shell
script) maybe just use a BSD file lock (flock(2)) on the top-level
directory you store your data in. If these are shell scripts you
should be able to use util-linux' flock tool, you could even prefix
your ExecStart= line with that if you want.

But no, systemd does not provide any mechanism to do file locking for
you.

Lennart

--
Lennart Poettering, Berlin


More information about the systemd-devel mailing list