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