Перейти к содержимому

Задачи по расписанию: cron и таймеры systemd

Настроить crontab, не потерять вывод задач и понять, когда лучше выбрать таймер systemd.

Уровень
Новичок
Время чтения
3 мин чтения
Обновлено
Проверено на
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Содержание
  1. Редактирование расписания
  2. Формат строки
  3. Окружение cron
  4. Где смотреть, что задача выполнилась
  5. Альтернатива: таймер systemd
  6. Проверьте результат

cron запускает команды по расписанию: бэкапы, очистку временных файлов, отчёты. Он есть в Ubuntu и Debian из коробки.

Редактирование расписания

bash
$ crontab -e$ crontab -l

У каждого пользователя свой crontab. Задачи, которым нужны права root, добавляйте через sudo crontab -e.

Формат строки

Пять полей времени и команда: минута, час, день месяца, месяц, день недели (0 или 7 — воскресенье).

РасписаниеКогда выполняется
*/5 * * * *каждые 5 минут
0 3 * * *каждый день в 03:00
30 2 * * 1по понедельникам в 02:30
0 4 1 * *первого числа каждого месяца в 04:00
@rebootодин раз после загрузки системы
Пример строки crontab
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Окружение cron

cron запускает команды с минимальным PATH и без переменных из вашего .bashrc. Поэтому скрипт, который работает в терминале, может молча падать по расписанию. Пишите полные пути к программам или задайте PATH первой строкой crontab:

text
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Где смотреть, что задача выполнилась

bash
$ journalctl -u cron --since today

На Ubuntu записи cron также попадают в /var/log/syslog. На Debian 12 rsyslog по умолчанию не установлен, поэтому смотрите журнал systemd. Вывод самой задачи сохраняйте в файл, как в примере выше, иначе он пропадёт.

Альтернатива: таймер systemd

Таймер удобнее, когда важно видеть логи задачи в journalctl, не запускать её дважды параллельно и выполнить пропущенный запуск после простоя. Нужны два файла — служба и таймер:

/etc/systemd/system/backup.service
[Unit]Description=Nightly backup[Service]Type=oneshotExecStart=/usr/local/bin/backup.sh
/etc/systemd/system/backup.timer
[Unit]Description=Run backup every night[Timer]OnCalendar=*-*-* 03:00:00Persistent=true[Install]WantedBy=timers.target
bash
$ systemctl daemon-reload$ systemctl enable --now backup.timer$ systemctl list-timers

Проверьте результат

Временно поставьте расписание на ближайшие минуты (*/2 * * * *), дождитесь запуска и проверьте лог задачи. Для таймера запустите службу вручную: systemctl start backup.service, затем journalctl -u backup.service. Потом верните нормальное расписание.

Дочитайте до конца — статья засчитается в обучении автоматически.

  • cron
  • crontab
  • расписание
  • таймер
  • systemd timer

Статья помогла?