Systemd-таймеры вместо Cron: создание таймера с логами в journalctl
Почему Systemd Timers вытесняют классический Cron?
Десятилетиями для запуска скриптов по расписанию использовался crontab. Однако у Cron есть огромные недостатки: при сбое скрипта Cron не пишет понятных логов (нужно настраивать отправку почты или городить перенаправления в файлы), он не умеет контролировать зависимости (например, «запускать скрипт только после старта сети и базы данных») и не сохраняет историю запусков. Systemd Timers — это современная замена Cron, встроенная в операционную систему Linux.
Сравнение Cron и Systemd Timers:
| Функция | Классический Cron | Systemd Timers |
|---|---|---|
| Логирование | Сложное, часто теряется | Централизованно пишется в journalctl |
| Контроль зависимостей | Отсутствует | Полная поддержка After=network.target |
| Пропущенные запуски | Если сервер был выключен — запуск теряется | Опция Persistent=true выполнит задачу сразу после включения |
Создание таймера systemd за 3 простых шага
Для создания таймера требуется создать 2 связанных файла в каталоге /etc/systemd/system/: файл службы (.service) и файл расписания (.timer).
Шаг 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. Создаем 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. Активируем и запускаем таймер
# Перечитываем конфигурацию systemd: sudo systemctl daemon-reload # Включаем и запускаем таймер: sudo systemctl enable --now my_backup.timer # Проверяем статус списка всех активных таймеров: sudo systemctl list-timersШаг 4. Просмотр логов выполненного таймера
sudo journalctl -u my_backup.service -n 20 --no-pager
Частые вопросы (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, что служба выполняет разовую задачу (скрипт) и сразу завершает свою работу, не оставаясь висеть постоянным фоновым процессом.