Что означает ошибка "cron не запускается"
Проблема проявляется в том, что запланированные задачи (cron jobs) не выполняются в указанное время. Пользователь не видит ожидаемого результата (например, не создался бэкап, не отправилось письмо), а в логах может отсутствовать какая-либо запись от cron или присутствовать сообщение об ошибке. Важно понимать, что cron сам по себе не генерирует явного "кода ошибки" — задача либо выполняется, либо нет, а диагностика проводится через логи и проверку состояния службы.
Причины возникновения
- Служба cron не запущена. В системах на
systemdдемонcron(пакетcronie) илиcrond(в RHEL-совместимых) может быть остановлен или отключён. - Неправильный синтаксис в crontab. Ошибка в формате строки расписания (например,
* * * *вместо* * * * *) или в команде. - Проблемы с путями и переменными окружения. Cron имеет ограниченное окружение. Использование относительных путей или команд, которых нет в
PATHпо умолчанию (/usr/bin:/bin), приведёт к сбою. - Недостаточно прав (permissions). У скрипта, который пытается выполнить cron, или у каталогов в пути нет прав на выполнение (
x) или чтение (r) для пользователя, от которого работает задача (частоrootили конкретный системный пользователь). - Повреждённый пакет cron или конфликт. Редко, но возможно повреждение файлов пакета
cronили конфликт с другим планировщиком (например,anacron).
💡 Совет: В 80% случаев проблема кроется в пунктах 2-4. Начинайте диагностику с логов.
Способы решения
Способ 1: Проверка и перезапуск службы cron
Первым делом убедитесь, что основной демон активен.
- Проверьте статус службы. Для большинства дистрибутивов она называется
cron(Debian/Ubuntu) илиcrond(RHEL/CentOS/Fedora).sudo systemctl status cron # Для Debian/Ubuntu # ИЛИ sudo systemctl status crond # Для RHEL/CentOS/Fedora - Если служба не активна (
inactive), запустите её:sudo systemctl start cron # или crond - Включите автозапуск при загрузке, если это необходимо:
sudo systemctl enable cron - После этого проверьте, появились ли в логах (
journalctl -u cron -f) записи о попытках выполнения задач.
Способ 2: Анализ логов cron
Логи — главный источник истины.
- Просмотрите системный журнал на предмет сообщений от cron. На Ubuntu/Debian:
На RHEL/CentOS/Fedora:sudo grep CRON /var/log/syslog | tail -20sudo grep CRON /var/log/cron | tail -20 - Если используется
systemd-журнал, команда универсальна:
Флагsudo journalctl -u cron -b --no-pager | grep -i "error\|fail" # Или для crond sudo journalctl -u crond -b --no-pager | grep -i "error\|fail"-bпоказывает записи с текущей загрузки. Ищите строки с(username)— это попытки запуска задач. СообщенияBAD FILE MODEилиcan't openукажут на проблемы с правами.
Способ 3: Проверка и исправление crontab-файла
Ошибки в самом файле расписания — частая причина.
- Посмотрите текущие задания пользователя (замените
usernameна нужного или используйтеsudo crontab -lдля root):sudo crontab -l -u username - Проверьте синтаксис. Каждая строка должна иметь 5 полей времени (миниute, hour, day of month, month, day of week) и затем команду. Пример корректной строки:
Убедитесь, что используется полный абсолютный путь к исполняемому файлу (* * * * * /usr/bin/python3 /home/user/script.py >> /home/user/log.txt 2>&1/usr/bin/python3, а не простоpython3). - Проверьте файл скрипта. Убедитесь, что в первой строке указан корректный интерпретатор (shebang), например
#!/bin/bashили#!/usr/bin/env python3, и что этот путь существует. - Убедитесь в отсутствии пустых строк или комментариев без
#. Пустая строка в crontab может вызвать ошибку парсинга у некоторых версий cron. - После исправления сохраните файл. Cron автоматически перечитает конфигурацию.
Способ 4: Проверка и исправление прав доступа (Permissions)
Cron запускает задачи от имени конкретного пользователя. У этого пользователя должны быть права.
- Проверьте права на сам скрипт:
Должно быть минимумls -l /path/to/your/script.sh-rwxr--r--(755) для скрипта, который должен выполняться. Владельцем должен быть пользователь, от которого запускается задача, или root.sudo chmod 755 /path/to/your/script.sh sudo chown username:username /path/to/your/script.sh # если нужно - Проверьте права на все родительские каталоги в пути к скрипту и к любому файлу, который скрипт пытается прочитать/записать. У каждого каталога в цепочке должен быть бит
x(execute/search) для пользователя cron.
Команда покажет права на каждый компонент пути. Если где-то стоитnamei -l /path/to/your/script.sh---для группы/остальных, cron не сможет пройти. - Если задача работает с файлами в домашней директории (
/home/username), убедитесь, что у этой директории права755(или хотя бы711).
Способ 5: Альтернатива — перевод задачи на systemd timer
Если проблема с классическим cron не решается, или вам нужны более продвинутые возможности (точное время, логирование в journal, триггеры по событиям), перенесите задачу в systemd timer.
- Создайте сервисный файл (например,
/etc/systemd/system/mybackup.service):[Unit] Description=My Daily Backup [Service] Type=oneshot ExecStart=/usr/local/bin/backup-script.sh User=backupuser - Создайте файл таймера (
/etc/systemd/system/mybackup.timer):[Unit] Description=Run backup daily at 2 AM [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target - Включите и запустите таймер:
sudo systemctl daemon-reload sudo systemctl enable --now mybackup.timer - Проверьте статус:
sudo systemctl status mybackup.timer.
Способ 6: Переустановка пакета cron (крайняя мера)
Если все вышеперечисленное не помогло, возможно, повреждены бинарные файлы демона.
- Переустановите пакет
cron(Debian/Ubuntu) илиcronie(RHEL/CentOS):# Debian/Ubuntu sudo apt-get update && sudo apt-get install --reinstall cron # RHEL/CentOS 8+ sudo dnf reinstall cronie - После переустановки перезапустите службу (см. Способ 1).
Профилактика
- Всегда используйте абсолютные пути в crontab-строках и внутри скриптов. Для определения полного пути команды используйте
which <command>. - Перенаправляйте вывод (
>> /path/to/log 2>&1) даже для простых задач. Это даст invaluable информацию при падении. - Тестируйте скрипт вручную от имени того пользователя, от которого он будет запускаться cron:
sudo -u username /path/to/script.sh. - Следите за свободным местом на разделе, где находится
/var(там могут храниться spool-файлы crontab) и на целевом разделе для логов/бэкапов. - Рассмотрите переход на systemd timers для новых задач, особенно если они требуют точного времени, зависимостей или расширенного логирования через
journalctl.