Hi Lennart,
> Can't you run your upgrade script in idempotent way as a helper
> service that is pulled in by your main daemon and ordered before it, > but conditions itself out if it already did its job? that's usually > the most robust way, since then it's sufficient to just restart your > daemon or reboot, and everything will always catch up correctly. > i.e. if you have foo-daemon.socket + foo-daemon.service then define > foo-upgrade.service that is pulled in from foo-daemon.service via > `Wants=foo-upgrade.service` + `After=foo-upgrade.service`. And then > add `ConditionFileExists=!/some/touch/file` to `foo-upgrade.service` to > make it a NOP if things have already been updated, using a touch > file. (some better, smarter condition check might work as well, see > man pages of things systemd can check for you). That is a great pattern!
A Type=oneshot seems useful for the upgrade process.
For the record, I have appended what ended up working.
Thanks!
Cheers,
Klaus
---
The following three unit files open a listening socket, run the myupgrade service,
and only then start the /usr/bin/mydaemon service. The socket listens while the
myupgrade service runs so that clients can connect. But the clients are queued
until myupgrade has finished and /usr/bin/mydaemon starts accepting
connections.
mydeamon.service:
[Unit]
Description=service that does something After=mydaemon.socket Requires=mydaemon.socket After=myupgrade.service Wants=myupgrade.service [Install] WantedBy=multi-user.target [Service] Type=simple ExecStart=/usr/bin/mydaemon myupgrade.service:
[Unit] Description=service to run before mydaemon
mydeamon.socket[Service] Type=oneshot ExecStart=/usr/bin/bash -c "echo goodnight;sleep 60;echo goodmorning" [Unit]
Description=mydaemon listen socket [Socket] ListenStream=9999 [Install] WantedBy=sockets.target |