Назад | Перейти на главную страницу

Более быстрый способ пинговать URL, чем curl

Каков был бы самый быстрый способ проверить, работает ли указанный URL? (отвечает в коде состояния OK http)?

На данный момент я использую curl, но у меня есть несколько URL-адресов для тестирования в цикле, поэтому я ищу самое быстрое решение.

Есть ли какие-нибудь возможности проверить помимо wget?

Я подозреваю, что любое увеличение производительности, которое вы увидите, связано с улучшением любой оболочки, которую вы используете для соединений, а не с накладными расходами на запуск curl для каждого URL. Будь то curl или netcat или wget, вы, вероятно, захотите запустить каждый из них отдельно, чтобы обрабатывать их результаты отдельно.

Но я отвечу на этот вопрос двумя способами, просто для удовольствия.

Во-первых, ты жестяная банка фактически устанавливайте TCP-соединения в bash без необходимости запускать что-то вроде curl / wget / netcat / fetch / etc. Например:

#!/usr/bin/env bash

hostlist=(
  www.xe.com
  www.google.com
)

for host in "${hostlist[@]}"; do
  exec 3<>/dev/tcp/$host/80         # open a socket connection on fd/3
  printf "HEAD / HTTP/1.0\n\n" >&3  # send a request
  read -u 3 protocol code message   # read the result (first line only)
  exec 3<&-; exec 3>&-              # close fd/3, in and out
  echo ">> $host -- $code $message ($protocol)"
  printf ">> %s -- %s %s (%s)\n" "$host" "$code" "${message%?}" "$protocol"
done

Я нашел хорошую документацию по этой функции bash Вот.

Обратите внимание на обработку $message. Поскольку это протокол HTTP, в строке есть \r в конце. Это убирает его для более четкого отображения.

Обратите внимание, что поиск «ОК», вероятно, не то, что вам нужно. В моем примере выше www.google.com возвращает 302 редирект, а не 200 OK, что является вполне допустимым ответом.

Также обратите внимание, что попытка открыть таким образом соединение с несуществующим хостом является ошибкой. Вы захотите подумать о различных условиях ошибок, с которыми вы можете столкнуться в этом скрипте, и о том, как вы хотите их обрабатывать.

Второй вариант - использовать инструмент, который позволяет указывать несколько URL-адресов в одной командной строке. Как это происходит, curl Является ли это. И вы можете массировать его выход красивыми и чудесными способами. Например:

curl -sL -w "%{http_code} %{url_effective}\\n" \ 
 "http://www.xe.com/" -o /dev/null \
 "http://www.google.com" -o /dev/null

Обратите внимание, что это решение выполняет HTTP GET, а не HEAD, поэтому вы передаете больше данных, но получаете более «чистый» результат. Если вы хотите сэкономить пропускную способность с помощью HEAD, используйте curl's -I вариант. (Я обнаружил, что в некоторых ситуациях, особенно с Java ™, метод HEAD периодически не реализуется. Использование GET может повысить вероятность того, что ответ будет эквивалентен ответу, предоставленному браузеру, хотя и за счет дополнительной полосы пропускания .)

Вы можете написать сценарий расширения списка URL-адресов в командной строке, как вам нравится. Хотя, конечно, если вы имеете дело с тысячами и тысячами URL-адресов, вы можете все-таки включить их в первое решение.

Может использовать Netcat?

( netcat $domain 80 | head -n 1 ) << EOF
HEAD / HTTP/1.0
Host: $domain


EOF

Вывод:

HTTP/1.1 200 OK