[systemd-devel] Antw: Re: Mutually exclusive (timer-triggered) services
Ulrich Windl
Ulrich.Windl at rz.uni-regensburg.de
Wed Oct 16 07:53:14 UTC 2019
>>> Alexander Koch <mail at alexanderkoch.net> schrieb am 15.10.2019 um 21:48 in
Nachricht <39b05185c3bdf699f7f00c23e0a4a9a5 at alexanderkoch.net>:
>> > * flock leaves the lock file behind so you'd need some type of
>>> cleanup in case you really want the jobs to be trace-free. This is
>>> not as trivial is it might seem, e.g. you cannot do it from the
>>> service units themselves in `ExecStartPost=` or similar.
>> An
>>
>> ExecStartPost=-/usr/bin/flock -F /path/to/lock.file \
>> /usr/bin/rm /path/to/lock.file
>>
>> should solve this issue.
>
> So you can remove a file other processes are blocked lock-waiting on?
> Didn't
> expect this to work, thanks for the hint.
It's a common misconception (especially when grown up with Windows) that "rm" removes a file: Actually it "unlinks" the name from the inode. As long as the inode is opened by the kernel, the file (as seen from the kernel's perspective) still exists.
>
>> If your units are actually dependent on each other, than maybe you
>> should think about your approach in general. But to be able to help you
>> with that we need more information about the actual dependencies of the
>> applications started by your units and at which interval they shall
>> run.
>
> Okay I guess I should come up with the actual scenario, here we go:
>
> On my Arch Linux workstation I've got three .timer triggered .service
> units
> that do package manager housekeeping (I don't know if you're familiar
> with
> Arch/Pacman so I'll annotate their purposes):
>
> 1) Synchronize package database (equivalent of `apt-get update` on
> Debian)
>
> [Timer]
> OnCalendar=8-17/2:00
> Persistent=true
>
> [Service]
> ExecStart=/usr/bin/pacman -Syq
>
> 2) Update file database (equivalent of `apt-file update`)
>
> [Timer]
> OnCalendar=weekly
> Persistent=true
>
> [Service]
> ExecStart=/usr/bin/pacman -Fyq
>
> 3) Purge old packages from cache (something like `apt-get autoclean`)
>
> [Timer]
> OnCalendar=daily
> Persistent=true
>
> [Service]
> ExecStart=/bin/sh -c 'paccache -r -k 2; paccache -r -k 0 -u'
>
> As you can see, I'd like to have different execution intervals for all
> of
> these tasks so I'd like to keep them as separate services (which also
> seems
> the intuitive approach to me).
>
> I must admit that I haven't tried, but I'm pretty sure that at least 1
> and
> 2 do lock the ALPM database so if you try to issue one of these Pacman
> calls
> while the other is running it will fail, complaining about a lock file
> being
> present.
>
> My current workaround for this is using `RandomizedDelaySec=15m` in
> conjunction with `AccuracySec=1` in the .timer units to spread the
> triggers.
>
> While this does work I'm really curious about the 'proper' way of
> modeling
> this. Is it such an academic problem to have the need of ensuring that
> two
> timers (or services) don't fire simultaneously? I had thought this to be
> really simple with such an elaborate service manager like systemd, with
> all
> its graph theory power and the-like.
>
> (If I were a heretic I'd say 'We can do DNS, DHCP and NTP with systemd
> without any third party software but we need additional utilities to
> ensure
> that two things don't happen at the same time??' ;) )
>
> I think there are plenty of other scenarios, e.g. ideally I'd like my
> backup
> service not to kick in while btrfs-scrub at home.service is running... or
> maybe
> it's just me seeing this need ;)
>
>
> Best regards,
>
> Alex
> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/systemd-devel
More information about the systemd-devel
mailing list