Аннотация
Cron — системная служба, которая запускает в указанное время перечисленные в /etc/crontab
команды. Служба запускается один раз при загрузке системы. Редактирование списка заданий рекомендуется выполнять при помощи команды:
Справка по инструменту доступна по команде man cron.
Управление возможно из графического интерфейса : Пуск → Панель управления → Система → Планировщик задач.
Systemd — системная служба, которая обеспечивает параллельный запуск других служб в процессе загрузки ОС. Systemd
оперирует специально оформленными файлами конфигурации— юнитами (unit
). Каждый юнит отвечает за конкретную службу (*.service
), точку монтирования (*.mount
), устройство (*.device
), файл подкачки (*.swap
), сокет (*.socket
) и т. д. Юниты systemd
имеют фиксированный набор параметров, оформленных в виде параметров команды systemctl
(start, stop, reload, restart
и т.д.).
Таймер systemd (далее просто таймер) — файлы юнитов systemd
, имя которых имеет расширение (*.timer
); они позволяют контролировать файлы служб (*.service
).
В зависимости от принципов запуска существуют три типа таймеров:
- таймеры реального времени, срабатывающие с привязкой к системному календарю. Аналогичны инструменту
cron
, но обладают более гибкими настройками периодов работы.;
- монотонные таймеры запускающиеся в назначенное время, прошедшее с определенной начальной точки. Не сработают, если комптютер в режиме ожидания.
Различия таймеров и заданий cron
Основные причины для применения таймеров вместо заданий cron
:
- таймеры используют единую систему команд инструмента управления службами
systemctl
; - таймеры имеют встроенные функции для ведения журналов и отслеживания состояния выполнения;
Информация |
---|
Для каждого таймера создается отдельный файл журнала journalctl |
- таймеры могут инициировать выполнение задач на основе событий системы, например запуска или окончания работы службы, вызванной другим таймером, а не только по расписанию как
cron
;
- приоритет выполнения таймеров выше, чем у заданий
cron
;
systemd
предотвращает возникновение работающих юнитов-дублей;- задания
cron
выполняются последовательно, если заданиям cron
назначен одинаковый интервал выполнениия первым выполнится требующее меньшего времени на выполнение. Таймеры могут работать асинхронно.
Создание таймеров
По умолчанию файлы с юнитами systemd
, включая юниты с таймерами, распологаются в каталоге /etc/systemd/system
. Файл с юнитом таймера (*.timer
) имеет ссылку на файл с юнитом службы (*.service
), которую он контролирует.
Systemd
имеет несколько зарезервированных системных юнитов, перечень которых доступен по команде man systemd.special
. Использование имён юнитов из перечня системных нежелательно и приводит к ошибке выполнения создаваемого юнита.
Общая структура юнитов служб:
Блок кода |
---|
title | /etc/systemd/system/<Служба>.service |
---|
|
[Unit]
Description= # имя и описание службы
[Service]
ExecStart=/usr/local/bin/<имя файла или сценария> # примеры выполняемой команды |
Общая структура юнитов таймеров:
Блок кода |
---|
title | /etc/systemd/system/<Таймер>.timer |
---|
|
[Unit]
Description = # имя и краткое описание таймера
[Timer]
<Событие срабатывания таймера>
Persistent = true # выполнить немедленно после старта системы, если предыдущий запуск был пропущен
AccuracySec= 1h #точность выполнения таймера.
# Параметр необходим для снижения нагрузки на ресурсы компьютера при одновременном запуске нескольких таймеров.
# Таймеры будут запускаться в разные моменты времени в пределах указанного диапазона.
Unit = # имя юнита запускаемой службы
[Install]
WantedBy = timers.target |
События Событие срабатывания
таймеровтаймера
Таймеры реального времени
Блок кода |
---|
title | /etc/systemd/system/<РеалВрТаймер>.timer |
---|
|
....
[Timer]
OnCalendar = DayOfWeek Year-Month-Day Hour:Minute:Second # параметр для задания таймера реального времени
# вместо DayOfWeek указать Sun, Mon, Tue, Wed, Thu, Fri, Sat . Чтобы таймер выполнялся ежедневно, нужно не указывать параметр или указать Mon..Sun
# вместо указания цифр для Year-Month-Day Hour:Minute:Second можно оставить *
# Пример для запуска в каждый вечер пятницы:
# OnCalendar = Fri *-*-* 18:00:00
# справка о формате времени - man 7 systemd.time
.... |
Монотонные таймеры
Блок кода |
---|
title | /etc/systemd/system/<МоноТаймер>.timer |
---|
|
....
[Timer]
<Событие> = <интервал>
# Перечень событий:
# OnActiveSec - старт текущего юнита таймера
# OnBootSec - после загрузки ОС
# OnStartupSec - после начала сеанса текущего пользователя
# OnUnitActiveSec - при старте юнита службы
# OnUnitInactiveSec - при завершении работы юнита службы
# Пример:
# OnActiveSec=50minutes
....
|
Перез запуском таймера необходимо перезагрузить systemd:
Command |
---|
systemctl daemon-reload
|
И проверить юниты на наличие синтаксических ошибок:
Command |
---|
systemd-analyze verify
|
Запуск таймера:
Command |
---|
systemctl start <имя_таймера>
|
Раскрыть |
---|
title | Пример создания таймера |
---|
|
Информация |
---|
Сценарий необходимо выполнять с правами администратора |
Блок кода |
---|
title | make-systemd-timer.sh |
---|
| |
|
Временное выполнение таймера
Чтобы инициировать таймер, который будет работать только пока существует текущий сеанс, выполнить:
Command |
---|
sudo systemd-run --<событие>="время" --unit="название службы"
|
Где:
--<событие>
это одно из событий срабатывания таймера (см Монотонные таймеры):
--on-active
--on-startup
--on-unit-active
--on-unit-inactive
--on-calendar
Справка по systemd-run
см. man 1 systemd-run
Управление таймерами
Пуск, автозапуск, перезапуск, останов, отключение аналогичны командам systemctl
для служб. Справка доступна по команде man systemctl
, краткая по systemctl -h
Просмотр журналов
таймеровюнитов
Посмотреть записи журнала конкретного юнита:
Command |
---|
journalctl -u <имя_юнита> # .service или .timer
|