How to restart service after some time

systemd

We have multiple systems that suffer from a firmware bug. The vendor is aware of the problem and will fix the firmware bug. Until then we have to live with a workaround: restart the relevant service some time after bootup.

There are mechanisms in systemd to control the restart of a failed service but they are not of help here because the service starts successfully. Just delaying the start of the service by – say – 1 minute does not help, it needs to be started twice.

So what's the best way to automatically restart a service after the system is up?

Best Answer

Create a .timer unit to control the .service unit.

Use the same base name as the service, so if the service were called thing, in /etc/systemd/system/foo.timer

[Unit]
Description=Start broken thing twice

[Timer]
OnBootSec=1min
OnBootSec=2min

[Install]
WantedBy=timers.target

Then enable this new timer. systemctl enable thing.timer

As the service remains active even if it has this problem, edit overrides such that it doesn't. systemctl edit thing.service
Which to change is hard to say without seeing the original unit. Perhaps add a ExecStartPost= command that returns 0 only if the device is in a good state. Or change RemainAfterExit=no to force a oneshot to not stay active.