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?
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
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 changeRemainAfterExit=no
to force a oneshot to not stay active.I suggest using cron in this case:
This should restart your service 5 minutes after the machine has booted
For more information see the Extension section in the crontab(5) manpage https://linux.die.net/man/5/crontab