Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.

Systemd-таймеры вместо Cron: создание таймера с логами в journalctl

Обновлено: 27.08.2026  ·  Официальная база знаний

Почему Systemd Timers вытесняют классический Cron?

Десятилетиями для запуска скриптов по расписанию использовался crontab. Однако у Cron есть огромные недостатки: при сбое скрипта Cron не пишет понятных логов (нужно настраивать отправку почты или городить перенаправления в файлы), он не умеет контролировать зависимости (например, «запускать скрипт только после старта сети и базы данных») и не сохраняет историю запусков. Systemd Timers — это современная замена Cron, встроенная в операционную систему Linux.

Сравнение Cron и Systemd Timers:

ФункцияКлассический CronSystemd Timers
ЛогированиеСложное, часто теряетсяЦентрализованно пишется в journalctl
Контроль зависимостейОтсутствуетПолная поддержка After=network.target
Пропущенные запускиЕсли сервер был выключен — запуск теряетсяОпция Persistent=true выполнит задачу сразу после включения

Создание таймера systemd за 3 простых шага

Для создания таймера требуется создать 2 связанных файла в каталоге /etc/systemd/system/: файл службы (.service) и файл расписания (.timer).

  1. Шаг 1. Создаем Unit-файл службы (.service)

    sudo nano /etc/systemd/system/my_backup.service

    Вставьте описание команды, которую нужно запускать:

    [Unit]
    Description=Ежедневный скрипт резервного копирования
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    Type=oneshot
    ExecStart=/bin/bash /opt/scripts/backup.sh
  2. Шаг 2. Создаем Unit-файл таймера (.timer)

    sudo nano /etc/systemd/system/my_backup.timer

    Опишите расписание (например, запуск каждый день в 03:00 ночи):

    [Unit]
    Description=Таймер для запуска бэкапа
    
    [Timer]
    # Запуск каждый день в 03:00 ночи:
    OnCalendar=*-*-* 03:00:00
    # Выполнить задачу, если сервер был выключен во время запуска:
    Persistent=true
    
    [Install]
    WantedBy=timers.target
  3. Шаг 3. Активируем и запускаем таймер

    # Перечитываем конфигурацию systemd:
    sudo systemctl daemon-reload
    
    # Включаем и запускаем таймер:
    sudo systemctl enable --now my_backup.timer
    
    # Проверяем статус списка всех активных таймеров:
    sudo systemctl list-timers
  4. Шаг 4. Просмотр логов выполненного таймера

    sudo journalctl -u my_backup.service -n 20 --no-pager
Практический опыт инженера: Чтобы проверить корректность вашего расписания OnCalendar до применения файла, используйте встроенную утилиту проверки: systemd-analyze calendar "*-*-* 03:00:00". Она покажет точное время следующего срабатывания и предупредит о синтаксических ошибках.

Частые вопросы (FAQ)

Как настроить запуск каждые 15 минут через OnCalendar?

Используйте синтаксис: OnCalendar=*:0/15. Для запуска каждый час: OnCalendar=hourly.

Как протестировать работу скрипта, не дожидаясь наступления времени таймера?

Вы можете вручную запустить службу в любой момент: sudo systemctl start my_backup.service.

Обязательно ли имена .service и .timer должны совпадать?

Да, если таймер называется my_task.timer, systemd автоматически связывает его с одноименной службой my_task.service.

Что означает директива Type=oneshot?

Type=oneshot указывает systemd, что служба выполняет разовую задачу (скрипт) и сразу завершает свою работу, не оставаясь висеть постоянным фоновым процессом.