Cron в Linux: задачи по расписанию и почему они молча не срабатывают

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

23 октября 2026 г.·4 мин чтения·cron, crontab, linux, automation

Бэкап каждую ночь, чистка логов раз в неделю, проверка сайта каждые пять минут — руками такое никто не делает. Для этого в 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

Три вещи, на которые стоит обратить внимание:

  1. Полный путь к скрипту. /opt/backup.sh, а не backup.sh — cron запускает команду из домашней папки.
  2. Перенаправление вывода. >> /var/log/backup.log 2>&1 дописывает в файл и обычный вывод, и ошибки. Без этого вы не узнаете, почему задача не сработала.
  3. Перевод строки в конце. После последней задачи нажмите 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.