#Почему cron не срабатывает
Cron запускает команду в минимальной среде: без привычных переменных окружения, с другим PATH, без рабочего каталога. Типичные причины: неверная запись расписания, относительные пути, не указан интерпретатор (php), скрипт не имеет права на выполнение, хостинг ограничивает частоту запуска (например, не чаще раза в 5–15 минут) или ошибка внутри самого скрипта. Если cron настроен через панель (ISPmanager, cPanel), проверьте, что задание активно.
#Частые причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверное расписаниеОпечатка в полях. | Срабатывает не тогда. | Проверьте на crontab.guru. |
| Относительные путиРабочий каталог другой. | Ошибка 'file not found'. | Используйте полные пути. |
| Не тот PHPВерсия отличается. | Скрипт падает в cron. | Укажите путь к нужной версии. |
| Нет правСкрипт не читается. | Permission denied в логе. | chmod/chown. |
| Ограничение хостингаМинимальный интервал. | Не запускается чаще. | Увеличьте интервал. |
| Ошибка внутри скриптаСкрипт падает. | Лог содержит ошибку. | Исправьте скрипт. |
#Порядок диагностики
- Проверьте расписание на https://crontab.guru/Откройте панель хостинга → «Планировщик задач», «Cron» или «Задания по расписанию» и скопируйте сохранённое выражение. Проверьте его поля (минута, час, день месяца, месяц, день недели) в справочнике cron или на crontab.guru; некоторые панели используют отдельные поля. Сравните фактическое время сервера и расписание, не забывая о часовых поясах и переключениях времени.
- Запустите команду вручную из консоли и убедитесь, что она работаетЕсли есть SSH, подключитесь под тем же пользователем, который выполняет задание, и вручную запустите именно команду из расписания, сначала убедившись, что она не выполняет необратимую отправку писем или списания. Для опасных задач создайте тестовый режим либо пробную копию. Сравните выходной код
echo $?и сообщения. Если вручную работает, а по расписанию нет, причина может быть в окружении и правах cron. - Используйте полные пути к PHP и скриптуВ SSH выполните
command -v phpиphp -v, но проверьте, что найденная версия подходит для вашего сайта. Для задания задайте абсолютный путь к бинарному PHP и скрипту, например/usr/bin/php -f /home/user/www/site/cron.php, заменив пути на реальные. В cron текущий каталог и переменная PATH могут отличаться от интерактивного терминала; используйте абсолютные пути и для файлов внутри скрипта. - Перенаправьте вывод в лог, чтобы увидеть ошибкиВ редакторе конкретного задания добавьте перенаправление вывода в доступный пользователю журнал, например
>> /home/user/cron.log 2>&1, после выполнения команды. Проверьте право записи в каталог и наличие свободного места. Не записывайте в журнал пароли и токены. Дождитесь планового запуска, откройте файл и найдите время, сообщение об ошибке и результат работы. - Проверьте права на скриптЧерез SSH проверьте
ls -l /фактический/путь/cron.phpи права прохода по каталогамnamei -l. Для запуска видаphp -f script.phpсамому файлу достаточно чтения для пользователя cron, исполняемый бит не обязателен. Исправляйте разрешения только у подтверждённой цели; не устанавливайте777и не меняйте владельца всего сайта. - Проверьте часовой пояс сервераНа Linux с systemd проверьте
timedatectl status, на другом окружении —date. Сопоставьте время системы и часовой пояс cron, особенно если расписание на полночь. Для cPanel и других панелей уточните у хостера, в каком часовом поясе рассчитываются задания. При расхождении настройте расписание, а не меняйте часовой пояс общего сервера без согласования. - Проверьте почту: cron отправляет ошибки на email пользователяЕсли вывода в собственный файл нет, проверьте почтовые уведомления cron для пользователя и раздел «История задач» в панели, если он предусмотрен. При правах администратора сервера можно изучить
journalctl -u cron --since "1 hour ago"на Debian либо соответствующий журнал службыcrond. Если запись о запуске есть, но результата нет, проверяйте команду и путь к PHP; если записи нет, расписание или служба не выполняются. - Проверьте ограничения тарифаВ панели хостинга найдите ограничения тарифа: минимальный интервал cron, лимиты CPU, времени выполнения и число одновременных задач. Если задание слишком частое, увеличьте интервал или используйте поддерживаемую очередь. После изменения дождитесь двух плановых запусков и сравните время, файл журнала и ожидаемое обновление данных; при повторных отказах передайте хостеру команду без секретов и журнал.
- Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Особенности популярных CMS
Для WordPress отключите псевдо-cron (define('DISABLE_WP_CRON', true); в wp-config.php) и запускайте wp-cron.php через системный cron: */5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1. Для Bitrix используйте bitrix/modules/main/tools/cron_events.php и отключите агенты на хитах в /bitrix/php_interface/dbconn.php (define("BX_CRONTAB_SUPPORT", true);). Проверьте логи агентов в админке.