How to use Systemd timers in CentOS7/RHEL7
Systemd Timer Presentation
Systemd allows you to define timers. This feature is meant to work with services but can be used for anything else. It is a powerful alternative to cron.
Service Creation
Let’s assume that you want to launch a backup script of your apache website every day.
Create the /var/www/backup directory:
# mkdir /var/www/backup
Create the /var/www/backup/backup.sh file and paste the following lines:
#!/bin/bash
DAYMONTH=`date "+%d"`
/bin/tar --selinux -czvf /var/www/backup/backup-$DAYMONTH.tgz /var/www/html &>/dev/null
Make it executable:
# chmod +x /var/www/backup/backup.sh
Create the /usr/lib/systemd/system/backup.service file and paste the following lines:
[Unit]
Description=Backup of my apache website
[Service]
Type=simple
ExecStart=/var/www/backup/backup.sh
[Install]
WantedBy=multi-user.target
Timer Creation
Create the /usr/lib/systemd/system/backup.timer file and paste the following lines:
[Unit]
Description=Execute backup every day at midnight
[Timer]
OnCalendar=*-*-* 00:00:00
Unit=backup.service
[Install]
WantedBy=multi-user.target
Some other options like OnCalendar are available:
- OnActiveSec defines a timer relative to the moment the timer itself is activated.
- OnBootSec defines a timer relative to when the machine was booted up.
- OnStartupSec defines a timer relative to when systemd was started.
- OnUnitActiveSec defines a timer relative to when the unit the timer is activating was last activated.
- OnUnitInactiveSec defines a timer relative to when the unit the timer is activating was last deactivated.
The RHEL 7.2 release brings three new options:
- AccuracySec defines the time window within the timer is scheduled to elapse (1min by default).
- Persistent, a boolean, if set to true, the time when the service unit was last triggered is stored on disk. This information is then used on next reboot to possibly execute overdue timer events, that could not take place because the system was powered off.
- WakeSystem, a boolean, if set to true, timers configured this way will cause the system to resume from system suspend.
With RHEL 7.3 comes the RandomizedDelaySec option, which schedules an event to occur later by a random number of seconds to spread workload over a longer time period and avoid several events executing at the same time (BZ#1305279).
Date Syntax
Each of the previous options uses the date syntax below:
Minimal form Normalized form
Sat,Thu,Mon-Wed,Sat-Sun ==> Mon-Thu,Sat,Sun *-*-* 00:00:00
Mon,Sun 12-*-* 2,1:23 ==> Mon,Sun 2012-*-* 01,02:23:00
Wed *-1 ==> Wed *-*-01 00:00:00
Wed-Wed,Wed *-1 ==> Wed *-*-01 00:00:00
Wed, 17:48 ==> Wed *-*-* 17:48:00
Wed-Sat,Tue 12-10-15 1:2:3 ==> Tue-Sat 2012-10-15 01:02:03
*-*-7 0:0:0 ==> *-*-07 00:00:00
10-15 ==> *-10-15 00:00:00
monday *-12-* 17:00 ==> Mon *-12-* 17:00:00
Mon,Fri *-*-3,1,2 *:30:45 ==> Mon,Fri *-*-01,02,03 *:30:45
12,14,13,12:20,10,30 ==> *-*-* 12,13,14:10,20,30:00
mon,fri *-1/2-1,3 *:30:45 ==> Mon,Fri *-01/2-01,03 *:30:45
03-05 08:05:40 ==> *-03-05 08:05:40
08:05:40 ==> *-*-* 08:05:40
05:40 ==> *-*-* 05:40:00
Sat,Sun 12-05 08:05:40 ==> Sat,Sun *-12-05 08:05:40
Sat,Sun 08:05:40 ==> Sat,Sun *-*-* 08:05:40
2003-03-05 05:40 ==> 2003-03-05 05:40:00
2003-03-05 ==> 2003-03-05 00:00:00
03-05 ==> *-03-05 00:00:00
hourly ==> *-*-* *:00:00
daily ==> *-*-* 00:00:00
monthly ==> *-*-01 00:00:00
weekly ==> Mon *-*-* 00:00:00
*:20/15 ==> *-*-* *:20/15:00
Note: *:20/15* means :20:00, :35:00, :50:00**, restarting the next hour at *:20:00.
Execution
Activate at boot and start the backup timer to get your website backed up every day:
# systemctl enable backup.timer
# systemctl start backup.timer
To check if the backup timer is enabled, type:
# systemctl is-enabled backup.timer
enabled
To check if the backup timer is running, type:
# systemctl is-active backup.timer
active
If you want to run the backup script at any time, type:
# systemctl start backup
If you decide to change the backup frequency, after modifying the OnCalendar value, don’t forget to type:
# systemctl daemon-reload
Sources: Borrowed from a very good article by Jason The Graham, with the help of the systemd.timer and systemd.time man pages.
With the RHEL 7.2 release, a new command is available to get some additional information about timers.
To get some information about our backup timer, type:
# systemctl list-timers backup*
NEXT LEFT LAST PASSED UNIT ACTIVATES
Thu 2016-01-14 00:00:00 CET 44min left n/a n/a backup.timer backup.service
1 timers listed.
Pass --all to see loaded but inactive timers, too.
Additional Resources
The ArchLinux wiki provides an interesting article about Systemd timers.
Testing Time
Test yourself!