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/ file and paste the following lines:

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/

Create the /usr/lib/systemd/system/backup.service file and paste the following lines:

Description=Backup of my apache website



Timer Creation

Create the /usr/lib/systemd/system/backup.timer file and paste the following lines:

Description=Execute backup every day at midnight

OnCalendar=*-*-* 00:00:00


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.


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

To check if the backup timer is running, type:

# systemctl is-active backup.timer

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!