linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Процессы и ресурсы/systemd-timers

kb/processes ── Процессы и ресурсы ── intermediate

systemd timers - замена cron

systemd timer - unit-файл `.timer`, запускающий парный `.service` по расписанию или через интервал после события (boot, last-run). Замена cron с логами в [[cmd-journalctl]] и зависимостями.

view as markdownaka: timer-unit, oncalendar, onbootsec, systemd-cron

Зачем не cron

cron умеет одно: «дёргай скрипт в эту минуту». systemd timer умеет:

  • Запускать через интервал после события (5 минут после boot, 1 час после предыдущего запуска), а не только в фиксированный момент времени.
  • Догонять пропущенные срабатывания после выключения хоста (Persistent=true).
  • Писать stdout/stderr автоматически в cmd-journalctl - никаких >> /var/log/myapp.log 2>&1 в скрипте.
  • Использовать всю инфраструктуру systemd: зависимости (After=/Requires=), sandbox-изоляцию (PrivateTmp=, ProtectSystem=), cgroup-лимиты (MemoryMax=).
  • Рандомизировать старт (RandomizedDelaySec=) чтобы 200 хостов не били в backup-сервер одновременно.

Cron остался - он не deprecated. Но для нового кода systemd timer удобнее.

Парность .timer + .service

Timer всегда работает в паре с одноимённым (или явно указанным) service-юнитом:

/etc/systemd/system/backup.timer    ← когда запускать
/etc/systemd/system/backup.service  ← что запускать

По умолчанию backup.timer триггерит backup.service. Если имена различаются - указать явно:

ini
[Timer]
Unit=other-backup.service

Типы триггеров

ДирективаТипКогда срабатывает
OnCalendar=calendarВ указанное время по календарю (как cron)
OnBootSec=monotonicЧерез N после загрузки ядра
OnStartupSec=monotonicЧерез N после старта systemd (≈ то же что boot)
OnActiveSec=monotonicЧерез N после активации самого таймера
OnUnitActiveSec=monotonicЧерез N после прошлого старта парного service
OnUnitInactiveSec=monotonicЧерез N после прошлого завершения парного service

Monotonic = считается от события, не от стенки. Не персистентный по умолчанию (после reboot счётчик сбрасывается). Удобно для «запусти через 10 минут после boot, потом каждые 6 часов».

Можно комбинировать - несколько On* в одном [Timer], сработает на любом условии.

OnCalendar - синтаксис

Формат: DOW YYYY-MM-DD HH:MM:SS. DOW и любые поля можно опускать (*).

ВыражениеЧто значит
*-*-* 03:00:00каждый день в 03:00
Mon..Fri *-*-* 09:00по будням в 09:00
Mon *-*-* 00:00:00каждый понедельник полночь (= weekly)
*-*-01 00:00:00первого числа каждого месяца (= monthly)
*-*-* *:0/15:00каждые 15 минут
2026-6,7,8-1,15 01:15:001 и 15 июня, июля, августа 2026
Mon *-05~03первый понедельник = третий с конца мая
*-05~03/2третий с конца мая, потом через каждые 2 дня

Алиасы: minutely, hourly, daily, weekly, monthly, yearly.

Проверить выражение перед коммитом - обязательно:

bash
systemd-analyze calendar "Mon..Fri *-*-* 09:00"
# Original form: Mon..Fri *-*-* 09:00
# Normalized form: Mon..Fri *-*-* 09:00:00
# Next elapse: Wed 2026-04-30 09:00:00 EDT
# From now: 14h left

AccuracySec и RandomizedDelaySec - почему не точно

По умолчанию systemd триггерит таймер не точно в указанную секунду, а в окно длиной 1 минута начиная с указанного времени. Это сделано специально: если 5 таймеров стоят на daily (= 00:00:00), они стартанут одновременно и положат I/O.

ini
[Timer]
OnCalendar=daily
AccuracySec=1us           # узкое окно - триггер в указанную секунду
RandomizedDelaySec=30min  # ещё и случайная задержка до 30 мин

Дефолт большинства системных таймеров - AccuracySec=1h или больше. Сужать только если задача реально критична ко времени.

Persistent - догонять после downtime

По умолчанию если в момент срабатывания хост был выключен - событие пропущено. С Persistent=true (только для OnCalendar=) systemd запоминает время последнего запуска в /var/lib/systemd/timers/ и при старте проверяет - если пропустили, дёргает прямо сейчас.

ini
[Timer]
OnCalendar=daily
Persistent=true       # критично для backup'ов на ноутбуках/dev-VM

Минимальный пример: backup каждые 6 часов

/etc/systemd/system/backup.service:

ini
[Unit]
Description=Nightly backup
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/do-backup.sh
User=backup

/etc/systemd/system/backup.timer:

ini
[Unit]
Description=Backup every 6h after boot
[Timer]
OnBootSec=15min
OnUnitActiveSec=6h
Persistent=true
RandomizedDelaySec=5min
[Install]
WantedBy=timers.target

Активировать:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer

Обрати внимание: WantedBy=timers.target (не multi-user.target), иначе таймер не подхватится при загрузке.

Просмотр и дебаг

bash
systemctl list-timers --all              # все таймеры с next/last run
systemctl status backup.timer            # state одного таймера
systemctl cat backup.timer               # итоговый unit с drop-in'ами
journalctl -u backup.service -S today    # что писал триггерящийся service
systemd-analyze calendar 'Mon *-*-* 04:00'   # проверка OnCalendar
systemd-analyze timespan '15days 6h'         # парсинг time-span

Удалить лишний дефолтный таймер (нет SSD - не нужен fstrim):

bash
sudo systemctl disable --now fstrim.timer

§ команды

bash
systemctl list-timers --all

Все таймеры с next/last run и парным service - обзор расписания хоста

bash
systemd-analyze calendar 'Mon..Fri *-*-* 09:00'

Проверить корректность OnCalendar-выражения и увидеть когда сработает

bash
journalctl -u backup.service -S today

Логи последних запусков triggered-сервиса за сегодня

bash
systemctl cat backup.timer

Итоговый unit с применёнными drop-in'ами - то что реально читает systemd

bash
sudo systemctl enable --now backup.timer

Активировать таймер сейчас и при загрузке (не сам service - таймер!)

§ см. также

  • systemdsystemd - init и менеджер сервисовsystemd - init-система Linux: PID 1, который запускает всё остальное, следит за зависимостями, перезапускает упавшее, агрегирует логи.
  • cmd-systemctlsystemctl - управление сервисами systemd`systemctl` - главный CLI для управления unit'ами systemd: сервисами, таймерами, маунтами, сокетами. Замена SysV-init/`service` на современных дистро.
  • cmd-journalctljournalctl - журнал systemd`journalctl` читает binary-журнал systemd-journald. Это центральный лог системы: kernel, systemd-сервисы, syslog - всё через один интерфейс.
  • cmd-cron-crontabcron и crontab - расписание задачcron - демон, который читает crontab-файлы и запускает задачи по расписанию. Формат: `min hour day month weekday command`. Anacron для выключаемых машин. На systemd-системах часто заменяется timers.
  • systemd-unit-typesТипы systemd-юнитовЮнит - управляемый systemd ресурс. Расширение файла = тип: `.service` (демон), `.socket` (lazy-старт по сокету), `.timer`, `.mount`, `.path`, `.slice`/`.scope` (cgroup'ы), `.target` (группа).
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки