Введение
Задания cron — это основа автоматизации в Linux, но иногда они перестают выполняться без явных причин. В этом руководстве описаны наиболее распространённые причины сбоев, а также пошаговые действия для их устранения. После выполнения рекомендаций вы сможете быстро выявить и исправить проблему, вернув работу планировщика в рабочее состояние.
Требования
- Доступ к системе через SSH или консоль с правами администратора (
sudo). - Версии операционных систем:
- Ubuntu 20.04 LTS / 22.04 LTS
- Debian 11
- CentOS 8
- Базовые инструменты:
crontab,systemctl,journalctl,grep,tail.
Пошаговая инструкция
Шаг 1: Проверьте синтаксис файла crontab
Убедитесь, что записи в вашем crontab имеют правильный формат. Неправильное расположение звёздочек, пробелов или отсутствие исполняемой части часто приводят к silencе‑сбой.
# Просмотрите текущий crontab
crontab -l
# Если нужно отредактировать
crontab -e
💡 Совет: Сохраните действующий crontab перед редактированием:
crontab -l > ~/cron_backup.$(date +%F).
Шаг 2: Убедитесь в правильности прав доступа и владельца
Задание может игнорироваться, если файл crontab принадлежит не тому пользователю или имеет неверные права. Для пользовательских заданий:
# Экспортируйте crontab во временный файл
crontab -l > /tmp/user.cron
# Верните правильные владельца и права
sudo chown $USER:$USER /tmp/user.cron
sudo chmod 600 /tmp/user.cron
# Вставьте обратно
crontab /tmp/user.cron
Для системных заданий (/etc/crontab, /etc/cron.d/*) убедитесь, что они доступны только для чтения владельцем.
Шаг 3: Просмотрите системный и пользовательский журнал событий cron
Cron записывает информацию о выполнении заданий в /var/log/syslog (запись с тегом CRON) или в /var/log/cron.log (если активен cron.log). Проверьте последние записи:
# Системный журнал (Debian/Ubuntu)
sudo grep CRON /var/log/syslog | tail -n 20
# Альтернативный журнал (некоторые дистрибутивы)
sudo tail -n 50 /var/log/cron.log
Ищите сообщения об ошибках, коды завершения (cron: не удалось выполнить команду) и время выполнения.
Шаг 4: Временно отключите задание для тестирования
Чтобы убедиться, что именно это задание является причиной проблемы, временно отключите его:
# Откройте crontab для редактирования
crontab -e
# Добавьте # в начало строки задания (например, `# */5 * * * * /path/to/script.sh`)
# Сохраните и выйдите
После редактирования перезапустите cron-сервис:
sudo systemctl restart cron
Если задание больше не появляется в журнале событий, проблема локализована.
Шаг 5: Проверьте конфигурацию cron-сервиса
Если задания по-прежнему не выполняются, проверьте сам демон cron:
# Статус службы
systemctl status cron
# Включён ли сервис (автоматический запуск при загрузке)
systemctl is-enabled cron
# Перезапустите при необходимости
systemctl restart cron
Если служба не запускается, выполните:
journalctl -u cron -b
и следуйте сообщениям об ошибках (часто это отсутствие зависимых пакетов, например cron или bsdmainutils).
Проверка результата
После выполнения шагов убедитесь, что задания снова работают:
- Проверьте журнал событий cron на наличие успешных выполнений:
sudo grep "COMMAND(exec)" /var/log/syslog | tail -n 5 - Если задание выполняется по расписанию, вы увидите новую запись с командой.
- Для пользовательских заданий также можно проверить
crontab -lи выполнить задание вручную (/path/to/script.sh), чтобы убедиться в корректности пути.
Возможные проблемы
| Симптом | Вероятная причина | Решение |
|---|---|---|
| Задание не появляется в журнале событий | Неправильный синтаксис crontab или опечатка в пути | Проверьте синтаксис, используйте crontab -l > /tmp/check && sudo crontab /tmp/check |
cron не запускается после обновления | Отсутствие зависимого пакета или повреждённая конфигурация | Выполните sudo apt-get install --reinstall cron (Debian/Ubuntu) или sudo yum reinstall cronie (RHEL/CentOS) |
| Задание запускается с ошибкой доступа к файлу | Некорректный рабочий каталог или права на целевой файл | Убедитесь, что целевой файл доступен (chmod 644 /path/to/file) и укажите правильный рабочий каталог в задании |
| Задание выполняется не по расписанию | Использование неправильных единиц времени (например, */5 вместо 0 */5) | Проверьте формат minute hour day month weekday с помощью man crontab |
| Задание выполняется, но не выполняет ожидаемого действия | Ошибки в скрипте, скрытые от cron | Добавьте set -e в скрипте или проверьте stderr в журнале событий cron |
Выполните описанные шаги и не забудьте перезапустить cron после каждого изменения. После этого большинство проблем с заданиями cron устраняются менее чем за 15 минут. Если проблема сохраняется, проверьте системный журнал (journalctl -u cron) на предмет дополнительных сообщений об ошибках.