3.2.5 CRON – Запуск скрипта по расписанию

TheHost CRON Banner

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

Вызвать запуск нужного вам скрипта с помощью планировщика CRON можно двумя способами: c помощью эмуляции загрузки определённого URL вашего сайта, что приводит к запуску нужного Вам скрипта и с помощью прямого запуска скрипта без обращений к веб-сервисам по протоколу HTTP/HTTPS. Ниже мы рассмотрим оба этих метода.

Эмуляция загрузки URL сайта

Данный способ максимально прост и приводит к запуску скрипта в среде обычной работы сайта на хостинге. Существенным плюсом этого метода является возможность передачи нужному скрипту дополнительных GET параметров, в которых могут храниться ключи запуска, идентификаторы, токены и т.д. Минусом этого метода является то, что обращение к скрипту выполняется с помощью HTTP запроса к веб-сервису, что накладывает дополнительное ограничение на время выполнения запроса.

В панели управления ISPManager в разделе Инструменты - Планировщик (cron) добавьте задание в формате:

  1. wget -O /dev/null "http://ваш_домен/ваш_скрипт?param1=data&param2=data"

Важно: используйте двойные кавычки для URL вашего CRON скрипта, т.к. в противном случае не будут переданы все параметры HTTP GET запросов.

Пример: CRON задание, при работе сайта по протоколу HTTP

В данном примере скрипт cron.php будет вызван с помощью интерпретатора PHP, установленного для сайта “website.com”. При этом скрипту будет передан HTTP GET параметр action со значением perform.

  1. wget -O /dev/null "http://website.com/cron/cron.php?action=perform"
Пример: CRON задание для сайта работающего по протоколу HTTPS

Если ваш сайт использует для работы защищённый протокол HTTPS, тогда крайне рекомендуем использовать параметр wget --no-check-certificate, отключающий проверку используемого на сайте SSL сертификата.

  1. wget -O /dev/null --no-check-certificate "https://website.com/cron/cron.php?action=perform"

Прямой вызов скрипта с помощью CRON

Описанный способ запускает необходимый вам скрипт с помощью прямого запуска интерпретатора, который исключает какие-либо обращения к веб-сервисам. Сильной стороной этого метода является отсутствие каких-либо прослоек в виде веб-сервисов при выполнении. Минусом является необходимость прямого указания интерпретатора для запуска того или иного скрипта, а для PHP ещё и требует указание версии интерпретатора, например PHP 7.1 или 8.0. К неприятным особенностям данного метода можно отнести и отсутствие возможности передачи POST/GET параметров. Единственное что можно передать − это ENV параметры, о чём будет написано ниже.

Для использования данного метода, в панели управления ISPManager в разделе Инструменты - Планировщик (cron) нужно добавить задание в формате:

  1. php-версия /var/www/ваш_логин/data/www/имя_домена/путь_файлу
Пример: CRON-задание с прямым вызовом PHP скрипта

В данном примере скрипт cron.php будет выполнен с помощью PHP версии 7.4.

  1. php-7.4 /var/www/superuser/data/www/website.com/cron/cron.php
Пример: CRON с передачей PHP скрипту ENV параметра

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

  1. ПАРАМЕТР=значение php-версия /var/www/ваш_логин/data/www/имя_домена/путь_файлу

В данном примере скрипту cron.php был передан ENV параметр MODE со значением production.

  1. MODE=production php-8.0 /var/www/superuser/data/www/website.com/cron/cron.php

Синтаксис времени выполнения CRON-задания

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

* * * * * command
- - - - -
| | | | |
| | | | +-- День недели (0 - 7, где 0 и 7 - воскресенье)
| | | +---- Месяц (1 - 12)
| | +------ День месяца (1 - 31)
| +-------- Час (0 - 23)
+---------- Минута (0 - 59)

К примеру, задание с графиком 0 2 * * * command будет выполнять ежедневно в 2 часа ночи.

Синтаксис CRON имеет и другие аргументы настройки времени выполнения кроме простого *.

Дополнительно: расширенный синтаксис CRON-заданий
  • Запятая , — чтобы указать два или больше вариантов времени выполнения одной и той же команды. Например, 0 1,3,5 * * * command - команда выполнится в 1 час, 3 часа и 5 часов.

  • Дефис - — чтобы задать диапазон времени выполнения одной команды. Например, 1-5 * * * * command - команда выполнится с 1 по 5 минуту каждого часа.

  • Косая черта / — для создания заданных интервалов времени в определённом диапазоне. Например, */15 * * * * command - команда выполнится каждые 15 минут.

  • Last L — для конкретной цели, чтобы определить последний день недели в данном месяце. Например, 0 12 * * 3L command - команда выполнится в последнюю среду месяца в 12 часов дня.

  • Рабочий день W — в табах числа и месяца, мы также можем использовать этот символ, чтобы определить ближайший рабочий день недели к заданному времени. Например, 0 9 * * 1W command - будет выполняться в 9:00 утра каждого рабочего дня месяца, начиная с ближайшего к первому числу.

  • Решетка # — чтобы указать день недели в месяце, даёт возможность выбрать цифру в диапазоне от 1 до 5. Например, 0 12 * * 2#1 command - команда выполнится в первый вторник месяца в 12 часов дня.

  • Вопросительный знак ? — например, чтобы выбрать определённый день для запуска скрипта, нам нужно указать либо число месяца, либо номер дня, мы не можем указывать оба значения одновременно. Вопросительный знак даёт возможность оставить одно значение пустым. Например, 0 3 15 ? * MON-FRI - команда выполнится в 3 часа утра 15-го числа каждого месяца, если это не выходной день (понедельник-пятница).

Внимание: на нашем хостинге запрещено создавать задания с интервалом выполнения чаще, чем раз в 5 минут. CRON-задание с такой частотой выполняться корректно не будут. На практике, это значит что Вам не стоит оставлять значения * в опции “минуты” интервала выполнения. Значение */4 и менее приведет к такому же результату.

Отображение добавленного CRON задания

После добавления задания планировщика CRON, оно должно отобразится в перечне заданий. Для того, чтобы пользователи не получали большое количество мусорных сообщений, связанных с выполнением CRON, к каждому заданию автоматически будет добавлено >/dev/null 2>&1. Наличие такой конструкции в конце команды является нормальным поведением панели управления хостингом и планировщика CRON.