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

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

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

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

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

Создание сервиса

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

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

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

1
chmod +x /home/scripts/backup.sh

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

1
2
3
4
5
6
7
8
9
[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 со следующим содержанием:

1
2
3
4
5
6
7
8
9
[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, то по истечению времени заставит систему возобновить работу из режима ожидания, если система поддерживает это.

Синтаксис дат и времени

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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.

Запуск

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

1
2
# systemctl enable backup.timer
# systemctl start backup.timer

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

1
2
# systemctl is-enabled backup.timer
enabled

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

1
2
# systemctl is-active backup.timer
active

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

1
# systemctl start backup

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

1
# systemctl daemon-reload

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

1
# systemctl list-timers backup*