Задача cron не выполняется
Если служба cron работает, а задача нет, причины почти всегда четыре: команда не найдена из-за короткого PATH, файл задачи отвергнут по правам или имени, в файле нет перевода строки в конце, либо задача выполняется, но её вывод теряется.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Команда не найдена из-за короткого PATH
У задачи минимальное окружение. Программы из /usr/local/bin обычно доступны, а из домашних каталогов и менеджеров версий — нет.
-
Файл в /etc/cron.d отвергнут
Файлы с точкой в имени и с правами шире 0644 игнорируются. Ошибки при этом нет.
-
Нет перевода строки в конце crontab
Последняя строка без перевода может быть отброшена. Это старая особенность, но встречается до сих пор.
-
Задача выполняется, но её вывод теряется
Вывод уходит письмом локальному пользователю. Без почтовой службы он исчезает, и кажется, что задача не работала.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Записи о фактических запусках задач.
journalctl -u cron --since "1 day ago" --no-pager | grep CMD | tail -20Задачи пользователя и системные файлы задач.
crontab -l && sudo ls -l /etc/cron.d/Работает ли сама служба.
systemctl status cron --no-pager | head -6Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- У задачи минимальное окружение. Программы из /usr/local/bin обычно доступны, а из домашних каталогов и менеджеров версий — нет.
- Как проверить
-
Посмотрите, что пишет задача, направив вывод в файл.
crontab -l command -v нужная-команда
- Как исправить
-
Пишите полные пути или задайте PATH в начале crontab.
# в начале crontab: # PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- Почему происходит
- Файлы с точкой в имени и с правами шире 0644 игнорируются. Ошибки при этом нет.
- Как проверить
-
Посмотрите файлы и их права.
ls -l /etc/cron.d/
- Как исправить
- Переименуйте файл без точек и поставьте права 0644 с владельцем root.
- Почему происходит
- Последняя строка без перевода может быть отброшена. Это старая особенность, но встречается до сих пор.
- Как проверить
-
Посмотрите конец файла.
tail -c 20 /var/spool/cron/crontabs/$USER | xxd | tail -2
- Как исправить
-
Правьте crontab только командой
crontab -e: она следит за форматом.
- Почему происходит
- Вывод уходит письмом локальному пользователю. Без почтовой службы он исчезает, и кажется, что задача не работала.
- Как проверить
-
Посмотрите записи cron о запуске задачи.
journalctl -u cron --since "1 day ago" --no-pager | grep -i CMD | tail -10
- Как исправить
-
Перенаправляйте вывод в файл или в журнал через
logger: тогда результат будет виден.# 0 3 * * * /usr/local/bin/task.sh 2>&1 | /usr/bin/logger -t task
Пример вывода
Задача запускалась, но команда не найдена. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
CRON[4300]: (root) CMD (/usr/local/bin/backup.sh)
CRON[4301]: (root) MAIL (mailed 42 bytes of output but got status 0x004b)
# при перенаправлении вывода в файл:
backup.sh: line 6: rclone: command not found
Связанные ошибки
- status=127 в systemd: команда не найдена Код 127 без имени: оболочка не нашла команду. Появляется, когда ExecStart запускает скрипт или sh -c, а внутри команды нет.
- Таймер срабатывает, но задача падает незаметно Таймер работает исправно, а задача каждый раз завершается ошибкой, и об этом никто не узнаёт. Как настроить оповещение через OnFailure.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- Failed to parse calendar expression: ошибка в OnCalendar systemd не разбирает календарное выражение таймера. Правила записи OnCalendar и проверка через systemd-analyze calendar.
- Таймер активен, но не срабатывает Таймер systemd в состоянии active, но служба не запускается. Разбор: нет условия срабатывания, таймер не включён, ошибка в OnCalendar.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
Где встречается чаще всего
Источники
-
crontab(5)
Формат файлов задач и требования к правам. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено файлом в /etc/cron.d с точкой в имени.