cron
Формат строки crontab — пять полей времени + команда:
Системные cron — в /etc/cron.d/, /etc/crontab, /etc/cron.{daily,weekly}.
Запуск задач по расписанию — классический cron и современные systemd-таймеры.
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
Две системы запуска по расписанию:
OnCalendar, persistent), интегрировано в systemd.Для новых задач на серверах часто предпочтительны таймеры; cron — когда нужно быстро и привычно.
Формат строки crontab — пять полей времени + команда:
Системные cron — в /etc/cron.d/, /etc/crontab, /etc/cron.{daily,weekly}.
Личные crontab лежат в /var/spool/cron/crontabs/, по файлу на
пользователя. Каталог закрыт: список видит только root, файл читает
только владелец.
Каждый запуск cron пишет в журнал: CRON[2086]: (deploy) CMD
(/usr/local/bin/tweak.sh) — так находят, чьё задание сработало.
Файл в /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 по
Токио:
Строка TZ=Asia/Tokyo в crontab меняет только окружение задания:
date внутри него печатает время Токио, а срабатывает задание всё
равно по поясу машины. Сервер обычно держат в UTC — тогда расписание
пишут в UTC. Сколько это по UTC в другом поясе, покажет date:
03:00 по Москве — 00:00 по UTC: строка расписания 0 0 * * *.
Пара файлов: .service (что делать) + .timer (когда).
Расписание OnCalendar, окружение службы и неполадки таймеров —
в systemd-timers.
$PATH и нет окружения интерактивной сессии (алиасов,
переменных из ~/.bashrc) — указывай абсолютные пути к командам и файлам,
не полагайся на то, что видно в обычном терминале.journalctl -u cron (Ubuntu 24.04) или grep CRON /var/log/syslog
(если cron пишет в syslog, а не только в journald).% в команде —
это перевод строки для cron, его нужно экранировать (\%).Добавь Persistent=true — выполнит пропущенный запуск после включения.
systemctl list-timers --all покажет все таймеры, включая неактивные, вместе с
временем последнего и следующего запуска.
crontab -e редактирует crontab текущего пользователя (хранится в
/var/spool/cron/crontabs/) — отдельно от системных файлов /etc/crontab и
/etc/cron.d/*, у которых пятое+одно поле — это ещё и имя пользователя, от
которого запускать команду. Перепутать формат — частая причина «работает у меня
в crontab -e, не работает как системная задача».
Есть неточность? Сообщить об ошибке в статье