2.12.10. Нестандартні завдання cron
Розклад cron дозволяє запускати завдання тільки з точністю до хвилини, точність до секунди не підтримується. Також завдання не можна запускати по черзі, коли наступне завдання запускається після завершення попереднього. Для реалізації таких сценаріїв можна використовувати корисні можливості Bash.
Послідовний запуск команд
Для послідовного запуску декількох команд потрібно вказати їх в одному завданні через ;:
command1 ; command2 ; ... ; commandn
Виконання наступної команди відбудеться в будь-якому випадку, навіть якщо попередня повернула помилку.
Якщо необхідно перевірити наявність помилки або успішного виконання попередньої команди, використовуйте роздільники:
&&— наступна команда буде виконана тільки у разі успішного виконання попередньої.||— наступна команда буде виконана тільки в тому випадку, якщо попередня команда не була виконана успішно і повернула помилку.
Приклад:
command1 ; command2 && command3 || command4
Порядок виконання: command1 і command2 будуть виконані в будь-якому випадку, але command3 буде виконана тільки за умови, що command2 була виконана без помилок. command4 буде виконана тільки в тому випадку, якщо при виконанні command3 була помилка.
Запуск з точністю до секунди
Важливі моменти:
- Завдання cron не запускаються на самому початку хвилини. Часто завдання може бути запущена в перші секунди хвилини або пізніше, у зв'язку з чим вказати точний час запуску проблематично.
- Не рекомендується задавати занадто велике значення для очікування, оскільки час виконання команди обмежений.
- Не рекомендується запускати завдання з надто малим інтервалом, оскільки це може призвести до надмірного споживання серверних ресурсів.
Як згадувалося вище, cron не має можливості налаштувати виконання з точністю до секунди, тому потрібно використовувати різні хитрощі, наприклад послідовний запуск з командами очікування:
sleep 30 ; command1
Друга команда буде запущена через 30 секунд.
Якщо потрібно запустити два завдання на початку хвилини і на 30 секунді тієї ж хвилини, то додайте два завдання з однаковим інтервалом, але одне з них вкажіть як sleep 30 ; ваша_команда. У такому випадку одне завдання запуститься на початку хвилини, а друге — через 30 секунд.
Надсилання запитів без використання DNS
Важливі моменти:
- Потрібно заздалегідь знати IP-адресу сервера з цільовим сайтом.
- Можливі проблеми з SSL, якщо цільовий IP не відповідний домену, який вказаний у сертифікаті.
Цей спосіб використовується, коли потрібно звернутися до будь-якого сайту безпосередньо за IP-адресою, без використання DNS для перетворення домену цільового сайту в його IP-адресу. Це може бути корисно, наприклад, для обходу захисту Cloudflare, тестування з'єднання з конкретним сервером або перевірки конфігурації хостингу.
wget
Утиліта wget за замовчуванням використовує DNS. Але якщо вказати заголовок Host вручну за допомогою параметра –header, можна спрямувати HTTP-запит безпосередньо за IP-адресою.
Увага!
Спосіб підходить тільки для запитів по HTTP. При використанні HTTPS будуть виникати помилки перевірки SSL-сертифіката, так як IP не збігається з доменом, який вказаний в сертифікаті.Приклад команди:
/usr/bin/wget -t 1 -O --header='Host: example.com' http://12.34.56.78/path/to/script.php
example.com— цільовий домен.12.34.56.78— IP-адреса сервера./path/to/script.php— шлях з URL, за яким потрібно виконати запит.
cURL
Утиліта cURL надає більш гнучкі можливості для роботи з IP-адресами без використання DNS, включаючи повноцінну підтримку HTTPS. За допомогою параметра –resolve можна явно вказати, яку IP-адресу використовувати для заданого домену і порту.
Приклад команди:
/usr/bin/curl --resolve example.com:443:12.34.56.78 https://example.com/path/to/script.php
example.com— цільовий домен (використовується в заголовках і при перевірці сертифіката).443— порт (для HTTPS). Для HTTP використовуйте порт80та схемуhttp://.12.34.56.78— IP-адреса сервера./path/to/script.php— шлях з URL, за яким потрібно виконати запит.
Також можна використовувати простіший метод — вказати заголовок вручну, як в wget, але він також не працює з HTTPS:
curl -H 'Host: example.com' http://12.34.56.78/path/to/script.php