3.2.5 CRON – Запуск скрипта за розкладом

TheHost CRON Banner

CRON - це важливий інструмент, що дозволяє серверу запускати виконання певних завдань або запитів за зазначеним наперед графіком.

Запустити необхідний вам скрипт за допомогою планувальника CRON можна двома способами: шляхом емуляції завантаження певного 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.