Краткий ответ
Задание cron чаще всего не выполняется из-за неправильного синтаксиса в crontab, отсутствия права на выполнение, неверного пути к скрипту или потому что служба cron не запущена. Проверьте логи, протестируйте скрипт вручную и используйте абсолютные пути.
Как проявляется проблема
- Задание не запускается в запланированное время
- Нет ожидаемого вывода или файла
- Лог cron пуст или показывает ошибки
- Скрипт работает вручную, но не из cron
- Уведомления об ошибках по электронной почте не приходят
Частые причины
Служба cron не запущена
Если демон cron не активен, ни одно задание не выполнится. Проверьте статус службы и запустите её при необходимости.
Неправильный синтаксис в crontab
Ошибка в полях времени или отсутствие завершающей строки может помешать выполнению. Проверьте формат и используйте `crontab -l`, чтобы увидеть активные задания.
Отсутствие права на выполнение
Скрипт должен иметь право на выполнение (`chmod +x`). Также проверьте, является ли владельцем пользователь, запускающий cron.
Неверный путь или окружение
Cron использует ограниченное окружение, поэтому относительные пути и переменные могут быть проблемой. Используйте абсолютные пути и явно определяйте переменные.
Проблемы с правами или владельцем
Файлы, к которым обращается скрипт, должны быть читаемы для пользователя cron. Проверьте права и владельца файлов и каталогов.
Пошаговое решение
- 1
Проверьте, запущена ли служба cron
Выполните
systemctl status cron(илиsystemctl status crondв некоторых дистрибутивах). Если служба не активна, запустите её с помощьюsudo systemctl start cronи включите автоматический запуск с помощьюsudo systemctl enable cron. - 2
Просмотрите активные задания cron
Выполните
crontab -l, чтобы увидеть задания для текущего пользователя. Для системных заданий просмотрите файл/etc/crontabи каталог/etc/cron.d/. Убедитесь, что нет синтаксических ошибок. - 3
Протестируйте скрипт вручную
Запустите скрипт из терминала от того же пользователя, который запускает cron. Если он не работает вручную, проблема в скрипте, а не в cron. Исправьте ошибки и повторите тест.
- 4
Используйте абсолютные пути
В crontab укажите полный путь к скрипту и интерпретатору, например
/usr/bin/python3 /home/пользователь/скрипт.py. То же самое относится и к файлам, к которым обращается скрипт. - 5
Задайте переменные окружения
В начало crontab добавьте
PATH=/usr/bin:/binи другие необходимые переменные. Вы также можете определить их внутри скрипта. Избегайте зависимости от переменных из интерактивной сессии. - 6
Проверьте права и владельца
Убедитесь, что скрипт имеет право на выполнение (
chmod +x скрипт.sh) и что пользователь, запускающий cron, имеет право читать и выполнять его. Проверьте также права на каталоги и файлы, которые использует скрипт. - 7
Просмотрите логи cron
В системах с systemd-journald используйте
journalctl -u cronилиjournalctl -u crond. В других системах просмотрите/var/log/syslogили/var/log/cron. Ищите ошибки, связанные с вашим заданием. - 8
Временно перенаправьте вывод в файл
Добавьте
>> /tmp/cron.log 2>&1в конец строки в crontab, чтобы перехватить стандартный вывод и ошибки. Затем просмотрите файл после выполнения задания. - 9
Проверьте правильность времени
Убедитесь, что системное время правильное (
date). Если часовой пояс неверный, cron будет запускаться в неправильное время. Настройте часовой пояс и синхронизацию времени.
Если ничего не помогает
Если вы проверили все вышеперечисленное, а задание всё ещё не выполняется, попробуйте запустить cron в режиме отладки. Для Vixie cron ненадолго остановите службу и запустите её вручную с sudo cron -f -x proc (или соответствующей опцией для вашего cron); после теста снова запустите службу. Это покажет подробную информацию об обработке заданий. Также проверьте, нет ли ограничений через файлы /etc/cron.allow и /etc/cron.deny, которые могут помешать пользователю использовать cron. Наконец, рассмотрите альтернативу, такую как systemd timer, который предлагает лучшее логирование и управление.
Как избежать повторения
- Регулярно проверяйте логи cron
- Используйте абсолютные пути и явные переменные
- Тестируйте скрипты перед добавлением в cron
- Ограничивайте права и следите за владельцем файлов
Когда лучше обратиться к специалисту
Если вы не можете найти причину или у вас нет доступа к логам и системным файлам, обратитесь в ИТ-поддержку. Они смогут быстрее изолировать проблему и предотвратить простои в работе.
Обслуживание ИТ-инфраструктуры · Серверы, сети, резервное копирование, безопасность и helpdeskЧастые вопросы
Почему моё задание cron не выполняется, хотя синтаксис правильный?
Самая частая причина, отсутствие права на выполнение скрипта или неверный путь к интерпретатору. Проверьте, работает ли скрипт при ручном запуске и все ли пути абсолютные.
Как увидеть ошибки, которые сообщает cron?
Вы можете временно перенаправить вывод в файл, добавив `>> /tmp/cron.log 2>&1` в crontab. Также просмотрите системные логи, такие как `/var/log/syslog` или `journalctl -u cron`.
Cron и anacron, это одно и то же?
Нет. Cron предназначен для точного планирования, но не запустит пропущенные задания, если компьютер был выключен. Anacron создан для выполнения пропущенных заданий, но не гарантирует точное время.