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.
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
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).
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 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.