Jason's Blog

A stochastic thought repository

How to Use Systemd Timers

| Comments

I was setting up some scripts to run backups recently, and decided I would try to set them up to use systemd timers rather than the more familiar to me cron jobs.

As I went about trying to set them up, I had the hardest time, since it seems like the required information is spread around in various places. I wanted to record what I did so firstly, I can remember, but also so that others don’t have to go searching as far and wide as I did.

There are additional options associated with the each step I mention below, but this is the bare minimum to get started. Look at the man pages for systemd.service, systemd.timer, and systemd.target for all that you can do with them.

Running a Single Script

Let’s say you have a script /usr/local/bin/myscript that you want to run every hour.

Service File

First, create a service file, and put it wherever it goes on your Linux distribution (on Arch, it is either /etc/systemd/system/ or /usr/lib/systemd/system).

myscript.service
1
2
3
4
5
6
[Unit]
Description=MyScript

[Service]
ExecStart=/usr/local/bin/myscript

Timer File

Next, create a timer file, and put it also in the same directory as the service file above.

myscript.timer
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Runs myscript every hour

[Timer]
# Time to wait after booting before we run first time
OnBootSec=10min
# Time between running each consecutive time
OnUnitActiveSec=1h
Unit=myscript.service

[Install]
WantedBy=multi-user.target

Enable / Start

Rather than starting / enabling the service file, you use the timer.

1
2
3
4
# Start timer, as root
systemctl start myscript.timer
# Enable timer to start at boot
systemctl enable myscript.timer

Running Multiple Scripts on the Same Timer

Now let’s say there a bunch of scripts you want to run all at the same time. In this case, you will want make a couple changes on the above formula.

Service Files

Create the service files to run your scripts as I showed previously, but include the following section at the end of each service file.

1
2
[Install]
WantedBy=mytimer.target

If there is any ordering dependency in your service files, be sure you specify it with the After=something.service and/or Before=whatever.service parameters within the Description section.

Alternatively (and perhaps more simply), create a wrapper script that runs the appropriate commands in the correct order, and use the wrapper in your service file.

Timer File

You only need a single timer file. Create mytimer.timer, as I outlined above.

Target File

You can create the target that all these scripts depend upon.

mytimer.target
1
2
3
4
[Unit]
Description=Mytimer
# Lots more stuff could go here, but it's situational.
# Look at systemd.unit man page.

Enable / Start

You need to enable each of the service files, as well as the timer.

1
2
3
4
5
systemctl enable script1.service
systemctl enable script2.service
...
systemctl enable mytimer.timer
systemctl start mytimer.service

Good luck.

Comments