Yesterday I configured backups with duplicity on a couple of servers using a 3rd party service, rsync.net, as the backup destination; since I am a little paranoid with backups I also wanted to schedule a daily task on my computer at home to mirror the backups from that service to a local directory, just in case. I could have used cron for this but since I use Gentoo with systemd now I wanted to try systemd timers.
Cron does seem to be a lot easier to use, but there are some advantages to using systemd timers. For example – from what I have read/understood so far:
- all the events are logged in the systemd journal, so you can easily check for example when a timer last ran and if the task was successful – this is very helpful when debugging;
- systemd timers are basically services, and as such they are more flexible than cron jobs; among other things you can specify IO scheduling priority, niceness, timeouts, etc. (see this);
- a timer can be triggered in various ways, even -for example- by hardware state changes;
- a timer can be configured to depend on another service, for example to mount some remote filesystem before executing the scheduled task.
Configuring systemd timers
So here’s how to configure a simple timer with systemd. In this example I want to mirror a remote directory to a local directory daily at 4am. For starters, you need to create a .timer file under /etc/systemd/system which looks like this:
[Unit] Description=Mirror rsync.net backups daily RefuseManualStart=no RefuseManualStop=no [Timer] Persistent=true OnCalendar=*-*-* 04:00:00 Unit=rsyncnet.service [Install] WantedBy=basic.target
You also need to create a second file with same name but with .service extension in the same location:
[Unit] Description=Mirror rsync.net backups daily RefuseManualStart=no RefuseManualStop=yes [Service] User=vito Type=simple ExecStart=/usr/bin/rsync -azP --delete ...
To have systemd pick up these files you need to run:
sudo systemctl daemon-reload
Then, to enable the scheduled task now and at startup:
sudo systemctl start rsyncnet.timer sudo systemctl enable rsyncnet.timer
To list the timers:
sudo systemctl list-timers --all
To trigger the task manually:
sudo systemctl start rsyncnet
To check the log for the task status:
journalctl -f -u rsyncnet.timer
Or you can check the status of both the timer and the service directly:
systemctl status rsyncnet.timer systemctl status rsyncnet.service
These are just the basics for a daily task which runs at a given time, but systemd timers are really flexible and powerful, I’d suggest you check the man pages for more info.