С чего начать Первые шаги трек · 15 ступеней
Linux Labs

Cron — планировщик задач

6 мин Ubuntu 24.04

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

Шпаргалка

6 команд Версия для печати
  • crontab -e свой crontab
  • crontab -l показать текущую crontab
  • */15 * * * * /usr/local/bin/backup.sh каждые 15 минут
  • systemctl list-timers список systemd-таймеров
  • journalctl -u backup.service лог конкретной задачи
  • grep CRON /var/log/syslog что запускал cron

Обзор

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

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

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

Рецепты

4

cron

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

┌── минута (0-59)
│ ┌── час (0-23)
│ │ ┌── день месяца (1-31)
│ │ │ ┌── месяц (1-12)
│ │ │ │ ┌── день недели (0-7, 0 и 7 = вс)
│ │ │ │ │
* * * * *  command
bash
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}.

Чужие crontab

Личные crontab лежат в /var/spool/cron/crontabs/, по файлу на пользователя. Каталог закрыт: список видит только root, файл читает только владелец.

text
student@ubuntu:~$ ls -ld /var/spool/cron/crontabs
drwx-wx--T 2 root crontab 4096 Oct 21 05:48 /var/spool/cron/crontabs
student@ubuntu:~$ sudo ls -l /var/spool/cron/crontabs
-rw------- 1 deploy crontab 209 Oct 21 05:48 deploy
student@ubuntu:~$ crontab -l -u deploy
must be privileged to use -u
student@ubuntu:~$ sudo crontab -l -u deploy
* * * * * /usr/local/bin/tweak.sh

Каждый запуск cron пишет в журнал: CRON[2086]: (deploy) CMD (/usr/local/bin/tweak.sh) — так находят, чьё задание сработало.

bash
sudo crontab -e -u deploy                 # поправить или удалить строку
sudo crontab -l -u deploy | grep -v tweak \
  | sudo crontab -u deploy -              # убрать одну строку
sudo crontab -r -u deploy                 # удалить ВСЕ задания deploy

Файл в /var/spool/cron/crontabs/ руками не правят: crontab проверяет синтаксис и ставит файлу нужные права и владельца. После crontab -r — no crontab for deploy: стёрты все строки, а не одна.

Расписание и часовой пояс

cron считает расписание по часовому поясу машины: 0 3 * * * — 03:00 по тому времени, которое показывает date. Пояс машины — в timedatectl (timedatectl); на учебной машине это Etc/UTC.

Смену пояса cron подхватывает без перезапуска. Задание 19 21 * * * после sudo timedatectl set-timezone Asia/Tokyo сработало в 21:19 по Токио:

text
student@node1:~$ cat /tmp/cron-tz.log
Wed Oct 21 21:19:01 JST 2026

Строка TZ=Asia/Tokyo в crontab меняет только окружение задания: date внутри него печатает время Токио, а срабатывает задание всё равно по поясу машины. Сервер обычно держат в UTC — тогда расписание пишут в UTC. Сколько это по UTC в другом поясе, покажет date:

text
student@ubuntu:~$ date -u -d 'TZ="Europe/Moscow" 03:00'
Wed Oct 21 00:00:00 UTC 2026

03:00 по Москве — 00:00 по UTC: строка расписания 0 0 * * *.

systemd timers

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

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

Расписание OnCalendar, окружение службы и неполадки таймеров — в systemd-timers.

Неполадки

4

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

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

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

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

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

systemctl list-timers --all покажет все таймеры, включая неактивные, вместе с временем последнего и следующего запуска.

Задача из crontab пользователя не видна в system crontab

crontab -e редактирует crontab текущего пользователя (хранится в /var/spool/cron/crontabs/) — отдельно от системных файлов /etc/crontab и /etc/cron.d/*, у которых пятое+одно поле — это ещё и имя пользователя, от которого запускать команду. Перепутать формат — частая причина «работает у меня в crontab -e, не работает как системная задача».

См. также

  • systemd — Init-система и менеджер служб (PID 1): юниты, цели, зависимости, журналы.
  • timedatectl — часовой пояс машины и UTC.
  • journalctl — Чтение журнала systemd (journald) — фильтры по службе, времени, приоритету.
Загрузка…