️ systemd Timers — Scheduled Tasks

If you like this project, consider supporting me on Buy Me a Coffee ☕️

systemd Timers — Scheduled Tasks

systemd timers are the modern replacement for cron jobs, offering calendar-based and monotonic scheduling with full integration into the systemd ecosystem. Each timer triggers a corresponding .service unit, with output logged via journald.

Advantages over cron / Преимущества перед cron:

When to use cron vs timers / Когда использовать cron vs таймеры:


📚 Table of Contents / Содержание

  1. Timer Basics
  2. Creating Timers
  3. Management
  4. Real-World Examples

Timer Basics

List Timers / Список таймеров

systemctl list-timers                         # List active timers / Список активных таймеров
systemctl list-timers --all                   # List all timers / Список всех таймеров
systemctl list-timers --state=failed          # Failed timers / Неудавшиеся таймеры

Timer Status / Статус таймера

systemctl status my.timer                     # Show timer status / Показать статус таймера
systemctl show my.timer                       # Detailed timer properties / Подробные свойства таймера
journalctl -u my.timer                        # Timer logs / Логи таймера
journalctl -u my.service                      # Service logs / Логи сервиса

Creating Timers

Timer Unit File / Файл таймера

/etc/systemd/system/my.timer

[Unit]
Description=Run my service daily

[Timer]
OnCalendar=*-*-* 03:00:00                     # Every day at 3 AM / Каждый день в 3:00
Persistent=true                               # Run if missed / Запустить если пропущено
RandomizedDelaySec=30min                      # Random delay / Случайная задержка

[Install]
WantedBy=timers.target

Service Unit File / Файл сервиса

/etc/systemd/system/my.service

[Unit]
Description=My backup job

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=backup
Group=backup

OnCalendar Formats / Форматы OnCalendar

OnCalendar=hourly                             # Every hour / Каждый час
OnCalendar=daily                              # Daily at midnight / Ежедневно в полночь
OnCalendar=weekly                             # Weekly on Monday / Еженедельно по понедельникам
OnCalendar=monthly                            # Monthly on 1st / Ежемесячно 1-го числа
OnCalendar=*-*-* 00:00:00                     # Every day at midnight / Каждый день в полночь
OnCalendar=*-*-* 03:00:00                     # Every day at 3 AM / Каждый день в 3:00
OnCalendar=Mon,Wed,Fri 10:00                  # Mon/Wed/Fri at 10 AM / Пн/Ср/Пт в 10:00
OnCalendar=*-01-01 00:00:00                   # New Year / Новый год
OnCalendar=*-*-01 02:00:00                    # 1st of month at 2 AM / 1-го числа в 2:00

Monotonic Timers / Монотонные таймеры

OnBootSec=15min                               # 15 min after boot / 15 мин после загрузки
OnUnitActiveSec=1h                            # 1 hour after last activation / 1 час после последней активации
OnUnitInactiveSec=30min                       # 30 min after last deactivation / 30 мин после последней деактивации
OnStartupSec=5min                             # 5 min after systemd started / 5 мин после запуска systemd

Timer Type Comparison / Сравнение типов таймеров

Timer Type Description (EN / RU) Use Case / Когда использовать
OnCalendar Calendar-based (like cron) / По календарю Backups at 3 AM, monthly tasks
OnBootSec After system boot / После загрузки Post-boot warmup, checks
OnUnitActiveSec After last activation / После активации Recurring polling intervals
OnStartupSec After systemd starts / После запуска systemd Similar to OnBootSec

Management

Enable & Start / Включить и запустить

sudo systemctl daemon-reload                  # Reload systemd / Перезагрузить systemd
sudo systemctl enable my.timer                # Enable timer / Включить таймер
sudo systemctl start my.timer                 # Start timer / Запустить таймер
sudo systemctl enable --now my.timer          # Enable and start / Включить и запустить

Control / Управление

sudo systemctl stop my.timer                  # Stop timer / Остановить таймер
sudo systemctl disable my.timer               # Disable timer / Отключить таймер
sudo systemctl restart my.timer               # Restart timer / Перезапустить таймер

Trigger Manually / Запустить вручную

sudo systemctl start my.service               # Run service now / Запустить сервис сейчас

Verify Timer Schedule / Проверить расписание таймера

# Check next run time / Проверить следующий запуск
systemd-analyze calendar '*-*-* 03:00:00'

# Test timer expression / Тестировать выражение таймера
systemd-analyze calendar 'Mon,Wed,Fri 10:00'

# Show timer next run / Показать следующий запуск таймера
systemctl list-timers backup.timer

Parse Calendar Specs / Разобрать спецификации календаря

systemd-analyze calendar daily                # Parse 'daily' / Разобрать 'daily'
systemd-analyze calendar hourly               # Parse 'hourly' / Разобрать 'hourly'
systemd-analyze calendar 'Mon *-*-* 10:00'    # Parse expression / Разобрать выражение

Real-World Examples

Daily Backup / Ежедневное резервное копирование

/etc/systemd/system/backup.timer

[Unit]
Description=Daily backup at 3 AM

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

/etc/systemd/system/backup.service

[Unit]
Description=Backup script

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=backup
# Enable / Включить
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer

Hourly Log Rotation / Ежечасная ротация логов

/etc/systemd/system/logrotate.timer

[Unit]
Description=Hourly log rotation

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target

/etc/systemd/system/logrotate.service

[Unit]
Description=Rotate logs

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.conf

Cleanup Old Files Every Week / Очистка старых файлов раз в неделю

/etc/systemd/system/cleanup.timer

[Unit]
Description=Weekly cleanup

[Timer]
OnCalendar=Sun 02:00
Persistent=true

[Install]
WantedBy=timers.target
#!/bin/bash
# /usr/local/bin/cleanup.sh
find /tmp -type f -mtime +7 -delete
find /var/log -name "*.log.gz" -mtime +30 -delete

Database Backup Every 6 Hours / Резервное копирование БД каждые 6 часов

/etc/systemd/system/db-backup.timer

[Unit]
Description=Database backup every 6 hours

[Timer]
OnCalendar=*-*-* 00,06,12,18:00:00
Persistent=true

[Install]
WantedBy=timers.target

/etc/systemd/system/db-backup.service

[Unit]
Description=Backup PostgreSQL database

[Service]
Type=oneshot
ExecStart=/usr/local/bin/pg-backup.sh
User=postgres
Environment="PGPASSWORD=<PASSWORD>"

Monitor Service Every 5 Minutes / Мониторинг сервиса каждые 5 минут

/etc/systemd/system/monitor.timer

[Unit]
Description=Monitor service every 5 minutes

[Timer]
OnBootSec=5min
OnUnitActiveSec=5min

[Install]
WantedBy=timers.target

Certificate Renewal Daily / Обновление сертификатов ежедневно

/etc/systemd/system/certbot.timer

[Unit]
Description=Certbot renewal

[Timer]
OnCalendar=daily
RandomizedDelaySec=1h
Persistent=true

[Install]
WantedBy=timers.target

/etc/systemd/system/certbot.service

[Unit]
Description=Certbot renewal service

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet
ExecStartPost=/bin/systemctl reload nginx

💡 Best Practices / Лучшие практики

[!NOTE] Common issues: Timer running but service not starting → check Requires=. Missed jobs not running → add Persistent=true. Wrong timezone → check timedatectl. / Частые проблемы: таймер работает но сервис нет → проверьте Requires=.


On this page

systemd Timers — Scheduled Tasks 📚 Table of Contents / Содержание Timer Basics List Timers / Список таймеров Timer Status / Статус таймера Creating Timers Timer Unit File / Файл таймера Service Unit File / Файл сервиса OnCalendar Formats / Форматы OnCalendar Monotonic Timers / Монотонные таймеры Timer Type Comparison / Сравнение типов таймеров Management Enable &amp; Start / Включить и запустить Control / Управление Trigger Manually / Запустить вручную Verify Timer Schedule / Проверить расписание таймера Parse Calendar Specs / Разобрать спецификации календаря Real-World Examples Daily Backup / Ежедневное резервное копирование Hourly Log Rotation / Ежечасная ротация логов Cleanup Old Files Every Week / Очистка старых файлов раз в неделю Database Backup Every 6 Hours / Резервное копирование БД каждые 6 часов Monitor Service Every 5 Minutes / Мониторинг сервиса каждые 5 минут Certificate Renewal Daily / Обновление сертификатов ежедневно 💡 Best Practices / Лучшие практики Documentation Links