How can I configure a systemd service to restart periodically?

I saw a solution here that seemed elegant, if a bit roundabout. The key idea is to create a one-shot service triggered by a timer that restarts another service.

For the timer:

[Unit]
Description=Do something daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

For the one-shot service:

[Unit]
Description=Restart service

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service

For the one-shot service on Ubuntu 16.04 LTS:

[Unit]
Description=Restart service

[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart my_program.service

This solution lets you leverage systemd's timers, including the ability to restart the service at a particular time of day, and not just after some amount of time has elapsed.


For systemd version >= 229, there is an option called RuntimeMaxSec, which terminates the service after it has been running for the given period of time.

e.g. To restart every 7 days:

[Service]
Restart=always
RuntimeMaxSec=7d

To me this seems more elegant than abusing Type=notify and WatchdogSec.

systemd provides a clean way to add and override directives in systemd unit files provided by vendors. Drop-In Units are described in man systemd.unit. For example, if you wanted to periodically restart the foo service provided by a package, you would create a file named /etc/systemd/system/foo.service.d/periodic-restart.conf. The contents would be as shown above. Then:

 systemctl daemon-reload
 systemctl restart foo

You can confirm that the Drop-In unit has been loaded because it will be reported in the status output:

 systemctl status

Finally, you can confirm the directive has been included by searching the systemctl show output:

 systemctl show foo.service | grep RuntimeMax

The directive reported by systemctl show will be "RuntimeMaxUSec`