How can I configure a systemd service to restart periodically?
I have a simple systemd service that needs to be periodically restarted to keep its process from bugging out. Is there a configuration option for systemd services to periodically restart them? All of the Restart*
options seem to pertain to restarting the service when it exits.
Solution 1:
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.
[Service]
Restart=always
RuntimeMaxSec=604800
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`
Solution 2:
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.
Solution 3:
Yes, you can make your service to restart it periodically by making your service of Type=notify
.
Add this option in [Service] section of your service file along with Restart=always
and give WatchdogSec=xx
, where xx is the time period in second you want to restart your service. Here your process will be killed by systemd after xx time period and will be restarted by systemd again.
for eg.
[Unit]
.
.
[Service]
Type=notify
.
.
WatchdogSec=10
Restart=always
.
.
[Install]
WantedBy= ....
Solution 4:
How about a crontab like
30 3 * * sun /bin/systemctl restart yourService
which would restart the service yourService at 3:30am each Sunday.