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 [Service] Type=oneshot ExecStart=/usr/bin/bash -c "echo goodnight;sleep 60;echo goodmorning" mydeamon.socket [Unit] Description=mydaemon listen socket [Socket] ListenStream=9999 [Install] WantedBy=sockets.target