CRON: настройка, запуск и примеры задач Crontab
CRON — это системный планировщик задач, который позволяет автоматически запускать команды и скрипты на сервере по заданному расписанию.
С его помощью можно выполнять резервное копирование, импортировать данные, отправлять уведомления, очищать временные файлы, запускать обработчики сайта и выполнять другие регулярные операции без участия пользователя.
Например, можно настроить:
— запуск скрипта каждые 5 минут;
— выполнение резервного копирования каждый день ночью;
— обновление каталога товаров раз в час;
— отправку отчёта каждое утро;
— очистку временных файлов раз в неделю.
Для хранения расписания используется crontab — таблица задач CRON.
— CRON;
— Crontab;
— Планировщик задач;
— Запланированные задания.
Обычно при создании задачи необходимо указать:
1. Название задачи.
2. Команду или файл для запуска.
3. Периодичность выполнения.
4. При необходимости — адрес электронной почты для получения сообщений об ошибках.
Если необходимо запустить PHP-файл напрямую, команда может выглядеть примерно так:
Поэтому перед добавлением задачи желательно уточнить реальные пути в панели управления хостингом или у технической поддержки.
В этом случае может потребоваться запуск через URL:
Для этого используется команда:
Просмотреть уже существующие задачи можно командой:
Например:
Минута — от 0 до 59.
Час — от 0 до 23.
День месяца — от 1 до 31.
Месяц — от 1 до 12.
День недели — обычно от 0 до 7, где 0 и 7 обозначают воскресенье.
Символ * означает любое допустимое значение.
Например:
Например:
Сначала лучше выполнить её вручную через SSH:
Только после успешного ручного запуска имеет смысл добавлять её в планировщик.
Посмотреть текущие права можно командой:
Например:
В частности, могут отличаться:
— переменная PATH;
— рабочая директория;
— версия PHP;
— переменные окружения;
— пользователь, от имени которого выполняется задача.
Поэтому в CRON лучше использовать полные пути к исполняемым файлам и скриптам.
То есть лучше писать:
Например:
Это позволяет быстро понять, что произошло при автоматическом запуске задачи.
После того как задача проверена и работает стабильно, ненужный вывод можно отключить:
Если задача выполняется дольше периода её запуска, может возникнуть ситуация, когда предыдущая копия скрипта ещё работает, а CRON уже запускает следующую.
Например, задача выполняется 10 минут, но запускается каждые 5 минут.
Для Linux-серверов один из вариантов решения — использовать flock:
Это особенно важно для импорта товаров, обмена с внешними системами, резервного копирования и других длительных операций.
Если требуется выполнить команду два раза в минуту, иногда используют две команды с задержкой:
Однако для постоянно работающих высокочастотных задач лучше использовать специализированные очереди, демоны или systemd timers, а не усложнять CRON.
1. Правильно ли указано расписание.
2. Существует ли указанный PHP-интерпретатор.
3. Правильно ли указан полный путь до скрипта.
4. Выполняется ли эта же команда вручную через SSH.
5. Есть ли у пользователя необходимые права.
6. Не требуется ли скрипту окружение веб-сервера.
7. Какая версия PHP используется при запуске.
8. Есть ли ошибки в логах.
CRON позволяет автоматизировать практически любые регулярные серверные задачи.
Для стабильной работы достаточно соблюдать несколько правил: использовать полные пути, сначала проверять команды вручную, записывать ошибки в лог и учитывать, что окружение CRON может отличаться от обычной SSH-сессии.
После настройки планировщик сможет запускать необходимые скрипты автоматически — раз в минуту, раз в час, по определённым дням недели или в любое другое заданное время.
Вернуться к блогу
С его помощью можно выполнять резервное копирование, импортировать данные, отправлять уведомления, очищать временные файлы, запускать обработчики сайта и выполнять другие регулярные операции без участия пользователя.
Что такое 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-сессии.
После настройки планировщик сможет запускать необходимые скрипты автоматически — раз в минуту, раз в час, по определённым дням недели или в любое другое заданное время.