has_many :codes

Tips and walkthroughs on web technologies and digital life

Systemd timers configuration in Gentoo

Published  

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.

Vito Botta

I am a passionate web developer based in Espoo, Finland. Besides computing, I love boxing, martial arts, and good food!

Recent posts

Tags

ansible API Apple Backup blogging CSS databases devops DNS Docker Google Hetzner Cloud JavaScript Jekyll kubernetes KVM Linux macOS mobile MySQL Nginx Performance PostgreSQL programming rancher Ruby Ruby on Rails security SQL Server Storage System Administration terraform Testing Virtualisation VPN Web Design Wordpress

Archives

© Vito Botta