Каков был бы самый быстрый способ проверить, работает ли указанный 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