Cron в Linux: задачи по расписанию и почему они молча не срабатывают
Как читать строку crontab, добавить задачу, проверить, что она выполняется, и обойти ловушки с PATH, символом % и часовым поясом. Ubuntu, Debian, AlmaLinux.

Бэкап каждую ночь, чистка логов раз в неделю, проверка сайта каждые пять минут — руками такое никто не делает. Для этого в Linux есть cron: планировщик, который сам запускает команды в заданное время. Пользоваться им просто, но у него есть несколько особенностей, из-за которых задача «вручную работает, а по расписанию нет».
Для экспериментов подойдёт любой VPS с Ubuntu или Debian; на tanaka.host сервер можно взять на день-два, пройти инструкцию и удалить без лишних трат.
Как работает cron
Cron — служба, которая раз в минуту просматривает списки задач. У каждой задачи есть расписание и команда; если текущая минута подходит — команда запускается, в нулевую секунду. Отсюда минимальный шаг: раз в минуту, чаще нельзя.
Списки называются crontab, у каждого пользователя свой. Задачи из crontab root выполняются с правами root, задачи обычного пользователя — с его правами. Редактируют не файл напрямую, а через crontab -e: команда откроет копию в редакторе, проверит синтаксис при сохранении и сообщит cron о новом расписании.
Главное, что нужно знать, — окружение. В терминале оболочка загружает ваши настройки, длинный PATH и текущую папку. Cron ничего этого не делает: PATH у него только /usr/bin:/bin, оболочка — простой /bin/sh, рабочая папка — домашняя. Программа из /usr/local/bin не найдётся, относительный путь укажет не туда, bash-синтаксис в sh не сработает.
И время: cron работает по часам и часовому поясу сервера. Если на сервере UTC, задача на 03:00 выполнится в 06:00 по Москве. Проверить пояс — timedatectl.
Строка расписания
Пять полей времени и команда:
* * * * * команда
│ │ │ │ │
│ │ │ │ └── день недели, 0–7 (0 и 7 это воскресенье)
│ │ │ └───── месяц, 1–12
│ │ └──────── день месяца, 1–31
│ └─────────── час, 0–23
└────────────── минута, 0–59
Звёздочка — любое значение. Ещё можно перечислять через запятую 1,15, задавать диапазон 1-5 и шаг */10.
| Расписание | Когда |
|---|---|
* * * * * |
каждую минуту |
*/5 * * * * |
каждые 5 минут |
0 * * * * |
в начале каждого часа |
0 3 * * * |
каждый день в 03:00 |
30 2 * * 1 |
по понедельникам в 02:30 |
0 9 * * 1-5 |
по будням в 09:00 |
0 0 1 * * |
первого числа каждого месяца в полночь |
@reboot |
один раз после загрузки сервера |
1. Откройте crontab
crontab -e
При первом запуске Debian и Ubuntu спросят, какой редактор использовать — 1 и Enter выберут nano. Поменять потом: select-editor. Строки с # — комментарии.
2. Добавьте задачу
В конец файла — строка задачи. Для примера: каждую ночь в 03:00 запускать скрипт бэкапа и писать весь его вывод в лог.
0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1
Три вещи, на которые стоит обратить внимание:
- Полный путь к скрипту.
/opt/backup.sh, а неbackup.sh— cron запускает команду из домашней папки. - Перенаправление вывода.
>> /var/log/backup.log 2>&1дописывает в файл и обычный вывод, и ошибки. Без этого вы не узнаете, почему задача не сработала. - Перевод строки в конце. После последней задачи нажмите Enter, иначе crontab не установится.
Сохраните (Ctrl+O, Enter, Ctrl+X). Если всё в порядке, увидите crontab: installing new crontab.
3. Проверьте, что задача выполняется
# Список задач
crontab -l
# Последние запуски
journalctl -u cron -n 20 | grep CMD # Ubuntu, Debian
journalctl -u crond -n 20 | grep CMD # AlmaLinux, Rocky
Чтобы проверить задачу сразу, временно поставьте ей * * * * *, дождитесь следующей минуты, посмотрите результат и верните нормальное расписание.
Полезные команды
crontab -e # редактировать свои задачи
crontab -l # показать свои задачи
crontab -r # удалить ВСЕ свои задачи без подтверждения
crontab -u ivan -l # задачи другого пользователя, только root
timedatectl # часовой пояс сервера
crontab -rстирает всё. Клавишиrиeрядом, вопросов команда не задаёт. Перед большими правками сохраните копию:crontab -l > ~/crontab.bak.
Частые ошибки
Вручную работает, из cron нет. Полные пути ко всем программам и файлам (which docker покажет путь). Если скрипт использует bash — первая строка #!/bin/bash и chmod +x. Перенаправьте вывод в лог и прочитайте ошибку. Если нужны переменные окружения, задайте их в начале crontab: PATH=/usr/local/bin:/usr/bin:/bin.
Команда с % не работает. Для cron % — перевод строки, всё после него уходит команде на stdin, а не в аргументы. date +%H:%M > файл превратится в date + без файла. Экранируйте: date +\%H:\%M.
new crontab file is missing newline before EOF, can't install. Нет перевода строки в конце. Ответьте y на вопрос о повторном редактировании, перейдите в конец, Enter, сохраните.
Срабатывает не в то время. Часовой пояс сервера: timedatectl. Либо пересчитайте время, либо смените пояс — timedatectl set-timezone Europe/Moscow и затем systemctl restart cron (на RHEL — crond).
Cron или служба systemd
Cron — для коротких задач по расписанию. Если программа должна работать постоянно и подниматься после падения — бот, веб-приложение — это служба systemd. Бэкапы и чистку оставьте cron: пример с rsync и restic.