CRON: настройка, запуск и примеры задач Crontab

6 мин чтения
CRON — это системный планировщик задач, который позволяет автоматически запускать команды и скрипты на сервере по заданному расписанию.

С его помощью можно выполнять резервное копирование, импортировать данные, отправлять уведомления, очищать временные файлы, запускать обработчики сайта и выполнять другие регулярные операции без участия пользователя.

Что такое CRON?

CRON работает в фоновом режиме и периодически проверяет список запланированных задач. Если текущее время совпадает с указанным в расписании, сервер запускает соответствующую команду.

Например, можно настроить:

— запуск скрипта каждые 5 минут;
— выполнение резервного копирования каждый день ночью;
— обновление каталога товаров раз в час;
— отправку отчёта каждое утро;
— очистку временных файлов раз в неделю.

Для хранения расписания используется crontab — таблица задач CRON.

Настройка CRON через панель хостинга

На большинстве хостингов есть отдельный раздел для работы с планировщиком задач. Он может называться:

— CRON;
— Crontab;
— Планировщик задач;
— Запланированные задания.

Обычно при создании задачи необходимо указать:

1. Название задачи.
2. Команду или файл для запуска.
3. Периодичность выполнения.
4. При необходимости — адрес электронной почты для получения сообщений об ошибках.

Если необходимо запустить PHP-файл напрямую, команда может выглядеть примерно так:


/usr/bin/php /home/user/www/site.ru/script.php

Путь к PHP и путь к сайту на разных серверах отличаются.

Поэтому перед добавлением задачи желательно уточнить реальные пути в панели управления хостингом или у технической поддержки.

Запуск PHP-скрипта или HTTP-запрос?

PHP-скрипт можно запускать непосредственно через PHP CLI:


/usr/bin/php /home/user/www/site.ru/script.php

Но некоторые скрипты рассчитаны именно на работу через веб-сервер и используют переменные окружения HTTP-запроса.

В этом случае может потребоваться запуск через URL:


curl -s https://site.ru/path/script.php

или:


wget -q -O - https://site.ru/path/script.php

Если скрипт нормально работает через CLI, такой вариант обычно предпочтительнее, так как служебный файл не требуется открывать для доступа из интернета.

Настройка CRON через SSH

Если есть доступ к серверу по SSH, задачи можно редактировать непосредственно через консоль.

Для этого используется команда:


crontab -e

После её выполнения откроется файл со списком задач текущего пользователя.

Просмотреть уже существующие задачи можно командой:


crontab -l

Каждая задача располагается на отдельной строке.

Например:


15 8 * * * /usr/bin/php /home/user/www/site.ru/script.php

Такой скрипт будет запускаться каждый день в 08:15.

Синтаксис расписания CRON

В начале каждой задачи указываются пять значений:


* * * * *
│ │ │ │ │
│ │ │ │ └─ день недели
│ │ │ └─── месяц
│ │ └───── день месяца
│ └─────── час
└───────── минута

Значения обозначают:

Минута — от 0 до 59.
Час — от 0 до 23.
День месяца — от 1 до 31.
Месяц — от 1 до 12.
День недели — обычно от 0 до 7, где 0 и 7 обозначают воскресенье.

Символ * означает любое допустимое значение.

Примеры расписания CRON

Каждую минуту:


* * * * *

Каждые 5 минут:


*/5 * * * *

Каждый час:


0 * * * *

Каждый день в полночь:


0 0 * * *

Каждый день в 08:15:


15 8 * * *

Каждый понедельник в 09:00:


0 9 * * 1

Каждый час в рабочее время с 9 до 18 часов:


0 9-18 * * *

В 08:00 и 23:00 каждый день:


0 8,23 * * *

Как узнать путь к PHP?

Если есть SSH-доступ, выполните команду:


which php

Например, сервер может вернуть:


/usr/bin/php

Версию PHP можно проверить командой:


php -v

На сервере может одновременно находиться несколько версий PHP. Поэтому важно убедиться, что CRON запускает именно ту версию, которая требуется вашему проекту.

Например:


/usr/bin/php8.2 /home/user/www/site.ru/script.php

Как узнать полный путь до скрипта?

Перейдите через SSH в директорию, где находится файл:


cd /home/user/www/site.ru

После этого выполните:


pwd

Команда покажет полный путь до текущей директории.

Например:


/home/user/www/site.ru

Тогда полный путь до файла script.php будет выглядеть так:


/home/user/www/site.ru/script.php

Проверяйте команду до добавления в CRON

Одна из самых распространённых ошибок — добавить команду в CRON и сразу пытаться понять, почему она не работает.

Сначала лучше выполнить её вручную через SSH:


/usr/bin/php /home/user/www/site.ru/script.php

Если команда завершается с ошибкой при ручном запуске, через CRON она также не заработает.

Только после успешного ручного запуска имеет смысл добавлять её в планировщик.

Права доступа к файлам

Пользователь, от имени которого выполняется задача CRON, должен иметь необходимые права для чтения и выполнения скрипта, а также записи в директории и файлы, которые изменяет скрипт.

Посмотреть текущие права можно командой:


ls -la script.php

При необходимости права можно изменить командой chmod.

Например:


chmod 744 script.php

Однако устанавливать права вроде 777 без необходимости не рекомендуется.

CRON запускается в другом окружении

Важно учитывать, что команда, запущенная через CRON, работает не совсем в том же окружении, что и команда из вашей SSH-сессии.

В частности, могут отличаться:

— переменная PATH;
— рабочая директория;
— версия PHP;
— переменные окружения;
— пользователь, от имени которого выполняется задача.

Поэтому в CRON лучше использовать полные пути к исполняемым файлам и скриптам.

То есть лучше писать:


/usr/bin/php /home/user/www/site.ru/script.php

а не просто:


php script.php

Логирование работы CRON

При настройке новой задачи полезно сохранять вывод команды в файл.

Например:


*/5 * * * * /usr/bin/php /home/user/www/site.ru/script.php >> /home/user/cron.log 2>&1

Конструкция:


>> /home/user/cron.log 2>&1

перенаправляет стандартный вывод и сообщения об ошибках в файл cron.log.

Это позволяет быстро понять, что произошло при автоматическом запуске задачи.

После того как задача проверена и работает стабильно, ненужный вывод можно отключить:


*/5 * * * * /usr/bin/php /home/user/www/site.ru/script.php >/dev/null 2>&1

Как предотвратить одновременный запуск нескольких копий скрипта?

Если задача выполняется дольше периода её запуска, может возникнуть ситуация, когда предыдущая копия скрипта ещё работает, а CRON уже запускает следующую.

Например, задача выполняется 10 минут, но запускается каждые 5 минут.

Для Linux-серверов один из вариантов решения — использовать flock:


*/5 * * * * flock -n /tmp/my-script.lock /usr/bin/php /home/user/www/site.ru/script.php

Пока одна копия команды удерживает блокировку, следующая не будет запущена.

Это особенно важно для импорта товаров, обмена с внешними системами, резервного копирования и других длительных операций.

Можно ли запускать задачу чаще одного раза в минуту?

Обычный CRON имеет минимальный интервал запуска в одну минуту.

Если требуется выполнить команду два раза в минуту, иногда используют две команды с задержкой:


* * * * * /usr/bin/php /home/user/www/site.ru/script.php; sleep 30; /usr/bin/php /home/user/www/site.ru/script.php

В результате первый запуск происходит сразу, второй — примерно через 30 секунд.

Однако для постоянно работающих высокочастотных задач лучше использовать специализированные очереди, демоны или systemd timers, а не усложнять CRON.

Основные причины, почему CRON не работает

Если задача не запускается, в первую очередь проверьте:

1. Правильно ли указано расписание.
2. Существует ли указанный PHP-интерпретатор.
3. Правильно ли указан полный путь до скрипта.
4. Выполняется ли эта же команда вручную через SSH.
5. Есть ли у пользователя необходимые права.
6. Не требуется ли скрипту окружение веб-сервера.
7. Какая версия PHP используется при запуске.
8. Есть ли ошибки в логах.

Итог


CRON позволяет автоматизировать практически любые регулярные серверные задачи.


Для стабильной работы достаточно соблюдать несколько правил: использовать полные пути, сначала проверять команды вручную, записывать ошибки в лог и учитывать, что окружение CRON может отличаться от обычной SSH-сессии.


После настройки планировщик сможет запускать необходимые скрипты автоматически — раз в минуту, раз в час, по определённым дням недели или в любое другое заданное время.
Вернуться к блогу