linux-labs

Вики / Службы и systemd

cron и systemd timers

Запуск задач по расписанию — классический cron и современные systemd-таймеры.

Две системы запуска по расписанию:

  • cron — классика, простой формат, на пользователя;
  • systemd timers — гибче (зависимости, журнал, OnCalendar, persistent), интегрировано в systemd.

Для новых задач на серверах часто предпочтительны таймеры; cron — когда нужно быстро и привычно.

Формат строки crontab — пять полей времени + команда:

┌── минута (0-59)
│ ┌── час (0-23)
│ │ ┌── день месяца (1-31)
│ │ │ ┌── месяц (1-12)
│ │ │ │ ┌── день недели (0-7, 0 и 7 = вс)
│ │ │ │ │
* * * * *  command
crontab -e                        # редактировать crontab пользователя
crontab -l                        # показать
*/15 * * * * /usr/local/bin/backup.sh   # каждые 15 минут
0 3 * * *   /usr/local/bin/nightly.sh    # ежедневно в 03:00

Системные cron — в /etc/cron.d/, /etc/crontab, /etc/cron.{daily,weekly}.

Пара файлов: .service (что делать) + .timer (когда).

# backup.timer
[Unit]
Description=Nightly backup
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl enable --now backup.timer
systemctl list-timers             # все таймеры и время следующего запуска
journalctl -u backup.service      # лог выполнения задачи

cron-задача не выполняется

  • У cron скудный $PATH и нет вашего окружения — указывай абсолютные пути.
  • Логи: journalctl -u cron или /var/log/syslog | grep CRON.
  • Каждая строка должна заканчиваться переводом строки; % нужно экранировать.

Таймер не сработал, пока машина была выключена

Добавь Persistent=true — выполнит пропущенный запуск после включения.

Не знаю, когда следующий запуск

systemctl list-timers --all.

crontab -e                        # моя crontab
*/15 * * * * cmd                  # каждые 15 минут
systemctl list-timers             # systemd-таймеры
journalctl -u NAME.service        # лог задачи

См. также