Cron не запускает скрипт: что проверить
Сначала выясните, запускал ли cron задачу: это видно в журнале. Если не запускал — дело в расписании, службе или времени сервера. Если запускал, а результата нет — в самой команде: путях, оболочке или правах.
Содержание 8
Что сделать прямо сейчас
- Допишите в конец строки задачи запись вывода в файл:
>> /home/ivan/backup.log 2>&1. Без этого ошибки команды пропадают. - Поставьте задаче время на 2–3 минуты вперёд по часам сервера — их покажет команда
date. - После этого времени откройте журнал cron:
sudo journalctl -u cron -n 50.
Если в журнале есть строка с CMD и вашей командой — cron задачу запускал, смотрите раздел «Cron запускает задачу, но она не работает». Если такой строки нет — раздел «В журнале нет записи о запуске».
Команды вводятся в терминале сервера после подключения по SSH (как подключиться).
Как понять, запускал ли cron задачу
Каждый запуск cron записывает в системный журнал. Найти строки своего скрипта:
sudo journalctl -u cron | grep backup.shЗапуск выглядит так:
Oct 10 03:30:01 myserver CRON[2345]: (ivan) CMD (/home/ivan/backup.sh)В скобках — владелец расписания и команда целиком. Время записи — время запуска по часам сервера.
В журнале нет записи о запуске
Служба cron не работает
systemctl status cronВ строке Active должно быть active (running). Если там inactive или failed, запустите службу и включите её автозапуск:
sudo systemctl enable --now cronЕсли команда отвечает, что службы cron нет, — cron не установлен:
sudo apt install cronЗадача в другом расписании
У каждого пользователя своё расписание, у root — тоже своё. Посмотрите оба:
crontab -l
sudo crontab -lЕсли строки нет ни там, ни там, расписание не сохранилось: после правки в редакторе терминал должен ответить crontab: installing new crontab. Если был ответ errors in crontab file, can't install., смотрите разбор errors in crontab file, can't install.
Время сервера не совпадает с вашим
Cron работает по часам сервера. Если сервер живёт по UTC, а вы — по Москве, задача на 0 3 * выполнится в 6:00 по Москве. Проверьте время и часовой пояс:
date
timedatectlПоставьте в расписании время по часам сервера или смените его часовой пояс — как это сделать, рассказано в инструкции по настройке VPS. После смены пояса перезапустите cron, чтобы он стал считать время по-новому:
sudo systemctl restart cronОшибка в расписании
- Заданы и день месяца, и день недели — cron запускает задачу по любому из них, а не когда совпадут оба.
- Шаг вида
*/7отсчитывается с начала каждого часа: после 56 минут следующий запуск — в 0 минут. - Перепутаны поля: первое — минута, второе — час.
3 30 *— ошибка: 30 часов не бывает, crontab такую строку не сохранит.
Как читается каждое поле — в справочнике Cron в Linux: как устроено расписание.
Файл в /etc/cron.d не подхватывается
- После пяти полей времени должно стоять имя пользователя:
30 3 * root /root/backup-site.sh. - В имени файла — только латинские буквы, цифры, дефис и подчёркивание. Файл с точкой, например backup.cron, cron пропускает.
- Владелец файла — root, и менять его может только root. Проверьте командой
ls -l /etc/cron.d.
Cron запускает задачу, но она не работает
Строка с CMD значит, что cron запустил команду. Дальше всё зависит от самой команды. Откройте файл, куда вы направили вывод:
cat /home/ivan/backup.logСообщение в нём подскажет, какой из пунктов ниже ваш.
Команда не найдена: not found
В задачах cron список папок для поиска программ (PATH) другой, чем в вашем терминале: папок, которые добавляют ваши .bashrc и .profile, в нём нет. Пишите полные пути. Путь к программе покажет which:
which phpЕсли ответ /usr/bin/php, пишите в расписании /usr/bin/php /home/ivan/task.php. Другой способ — задать PATH в начале расписания целиком, например PATH=/usr/local/bin:/usr/bin:/bin. Запись $PATH в расписании не работает.
Скрипт написан для bash
Cron выполняет строку расписания через sh, а не bash. Команды, которые есть только в bash, — например, проверки [[ … ]], — sh не понимает. Решения:
- Вынесите команды в скрипт и сделайте его первой строкой
#!/bin/bash, а в расписании запускайте скрипт по полному пути. - Или задайте оболочку для всего расписания строкой
SHELL=/bin/bashв его начале.
В команде есть знак %
Знак % cron считает концом команды: всё после него обрезается. Команда date +%F в расписании не сработает. Поставьте перед каждым % обратную косую черту:
0 3 * * * tar -czf /home/ivan/site-$(date +\%F).tar.gz /var/www/example.comPermission denied
Если в файле вывода сообщение со словами Permission denied про сам скрипт, у него нет права на запуск. Дайте его:
chmod u+x /home/ivan/backup.shПодробнее — в разборе Permission denied при запуске скрипта. Если Permission denied про файлы, которые скрипт читает или пишет, — задаче не хватает прав пользователя, смотрите пункт про root ниже.
Скрипт ищет файлы не там
Задача стартует в домашней папке владельца расписания, а не в папке скрипта. Путь data/list.txt внутри скрипта будет искаться в /home/ivan/data. Пишите в скрипте полные пути или перейдите в нужную папку в начале команды:
30 3 * * * cd /home/ivan/app && ./backup.sh >> /home/ivan/backup.log 2>&1Нет переменных из вашего терминала
Переменные, которые вы задали в .bashrc или .profile, задачам cron не видны. Задайте нужные переменные в начале расписания строками ИМЯ=значение или в самом скрипте.
Команде нужны права root
sudo в строке расписания не сработает: cron не может ввести пароль (подробнее). Добавьте задачу в расписание root:
sudo crontab -eВывод пропадает
Если вывод не направлен в файл, cron пытается отправить его письмом. На сервере без почты он пропадает, а в журнале появляется строка No MTA installed, discarding output — разбор No MTA installed, discarding output.
Как проверить команду так, как её запустит cron
Запустите команду с минимальным окружением — без ваших настроек из .bashrc и с коротким PATH, через sh и из домашней папки:
cd ~ && env -i HOME=$HOME LOGNAME=$USER PATH=/usr/bin:/bin /bin/sh -c '/home/ivan/backup.sh'Вместо /home/ivan/backup.sh подставьте команду из своей строки расписания. Если так команда выдаёт ошибку, а в вашем терминале работает, причина — в путях, оболочке или переменных из пунктов выше.
Похожие ошибки
| Ошибка | Разбор |
|---|---|
errors in crontab file, can't install. | Разбор |
No MTA installed, discarding output | Разбор |
Permission denied при запуске скрипта | Разбор |
sudo: a terminal is required to read the password | Разбор |
Команды и тексты сообщений сверены с пакетом cron 3.0pl1-184ubuntu2 из Ubuntu 24.04 — его справкой и исходным кодом.
Источники
- Справка crontab(5) из пакета cron для Ubuntu 24.04 — поля расписания, диапазоны, шаг, записи с @, знак %, переменные.
- Справка cron(8) из пакета cron для Ubuntu 24.04 — проверка расписаний раз в минуту, /etc/cron.d, часовой пояс.
- Исходный код cron: do_command.c — запуск через sh -c из домашней папки, текст No MTA installed.
- Исходный код cron: misc.c — вид записей cron в журнале.
- Служба cron в Ubuntu 24.04: cron.service — как запускается cron.
- Справка journalctl для Ubuntu 24.04 — ключи -u и -n.
- Справка timedatectl для Ubuntu 24.04 — часовой пояс сервера.
- Справка env для Ubuntu 24.04 — ключ -i запускает команду с пустым окружением.
Сверено 10 октября 2026 года.
Что почитать дальше
Проверено и обновлено: 10.10.2026