Systemd Timer

Запуск задач по расписанию через Systemd Timer

Systemd позволяет установить таймеры. Эта функция предназначена для работы с сервисами, но может быть использована и для других вещей. Это достаточно мощная замена привычному cron и anacron.

Для примера настроим таймер для выполнение бэкапа сайта на каждый день.

Подготовим элементарный скрипт бэкапа:

#!/bin/bash
DAYMONTH=`date "+%d"`
/bin/tar --selinux -czvf /srv/www/example.com/backup-$DAYMONTH.tgz /backup &>/dev/null

Не забываем выдать соответствующие привилегии на запуск:

chmod +x /home/scripts/backup.sh

Теперь создаем новый файл /usr/lib/systemd/system/backup.service следующего содержания:

[Unit]
Description=Backup www of example.com
 
[Service]
Type=simple
ExecStart=/home/scripts/backup.sh
 
[Install]
WantedBy=multi-user.target

Создадим новый файл /usr/lib/systemd/system/backup.timer со следующим содержанием:

[Unit]
Description=Execute backup every day at 04:00
 
[Timer]
OnCalendar=*-*-* 04:00:00
Unit=backup.service
 
[Install]
WantedBy=multi-user.target

Опции OnCalendar

  • OnActiveSec - определяет таймер относительно момента времени его активации.
  • OnBootSec - определяет таймер при загрузке системы.
  • OnStartupSec - определяет таймер при запуске systemd.
  • OnUnitActiveSec - определяет таймер относительно момента когда таймер был активен последний раз.
  • OnUnitInactiveSec - определяет таймер относительно момента когда таймер был деактивирован.

Опции добавленные в RHEL 7.2

  • AccuracySec - определяет таймер за прошедшее в течение временного окна, начиная с заданного времени.
  • Persistent - логическое значение true и false. Информация о времени когда сервис выполнялся последний раз хранится на диске. Эта информация затем используется при перезагрузке для возможности выполнить просроченное событие таймера, которое не было выполнено из-за отключения системы.
  • WakeSystem - логическое значение, если установлено true, то по истечению времени заставит систему возобновить работу из режима ожидания, если система поддерживает это.
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

Заметьте, что *:20/15 означает *:20:00, *:35:00, *:50:00, перезапуск в следующий час в *:20:00.

Активируем загрузку и запустим сервис:

# systemctl enable backup.timer
# systemctl start backup.timer

Для проверки автозапуска:

# systemctl is-enabled backup.timer
enabled

Для проверки запуска таймера:

# systemctl is-active backup.timer
active

Если необходимо, сервис можно запустить вручную в любое время:

# systemctl start backup

Если были внесены какие-то изменение в таймер, например время выполнения, то необходимо произвести обновление сервиса:

# systemctl daemon-reload

Начиная с версии RHEL 7.2 доступна новая команда для просмотра некоторой информации по установленным таймерам:

# systemctl list-timers backup*