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 секунд.

Важные моменты:

  • Нужно заранее знать IP-адрес сервера с целевым сайтом.
  • Возможны проблемы с SSL, если целевой IP не соответствует домену, который указан в сертификате.

Этот способ используется, когда нужно обратиться к какому-либо сайту напрямую по IP-адресу, без использования DNS для преобразования домена целевого сайта в его IP-адрес. Это может быть полезно, например, для обхода защиты Cloudflare, тестирования соединения с конкретным сервером или проверки конфигурации хостинга.

Утилита 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 предоставляет более гибкие возможности для работы с 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
Содержание