Ошибки

Cron не запускает скрипт: что проверить

Сначала выясните, запускал ли cron задачу: это видно в журнале. Если не запускал — дело в расписании, службе или времени сервера. Если запускал, а результата нет — в самой команде: путях, оболочке или правах.

Обновлено 10.10.2026≈ 7 мин чтения
Содержание 8

Что сделать прямо сейчас

  1. Допишите в конец строки задачи запись вывода в файл: >> /home/ivan/backup.log 2>&1. Без этого ошибки команды пропадают.
  2. Поставьте задаче время на 2–3 минуты вперёд по часам сервера — их покажет команда date.
  3. После этого времени откройте журнал 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.com

Permission 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 — его справкой и исходным кодом.

Источники

Сверено 10 октября 2026 года.

Что почитать дальше

Проверено и обновлено: 10.10.2026