指定されたURLが機能しているかどうかを確認する最も速い方法は何でしょうか? (OK httpステータスコードで応答)?
現時点ではcurlを使用していますが、ループでテストするURLがたくさんあるので、最速の解決策を探しています。
Wget以外にチェックするオプションはありますか?
パフォーマンスの向上は、URLごとにcurl
を起動するオーバーヘッドではなく、接続に使用しているラッパーを改善したことによるものと思われます。 curl
またはnetcat
またはwget
のいずれであっても、結果を個別に処理するために、それぞれを個別に起動することをお勧めします。
しかし、私はこの質問に2つの方法で答えます。
まず、canは、curl/wget/netcat/fetch/etcのようなものを起動することなく、bashで実際にTCP接続を確立できます。たとえば、 :
#!/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
があります。これはそれを取り除き、より適切な表示を行います。
「OK」を探すことはおそらくあなたがしたいことではないことに注意してください。上記の私の例では、www.google.comは200OKではなく302リダイレクトを返します。これは完全に有効な応答です。
この方法で存在しないホストへの接続を開こうとするとエラーになることにも注意してください。このスクリプトで発生する可能性のあるさまざまなエラー状態と、それらをどのように処理するかについて検討する必要があります。
2番目のオプションは、1つのコマンドラインで複数のURLを提供できるツールを使用することです。たまたま、curl
がこれを行います。そして、あなたはその出力を美しくそして不思議な方法でマッサージすることができます。例えば:
curl -sL -w "%{http_code} %{url_effective}\\n" \
"http://www.xe.com/" -o /dev/null \
"http://www.google.com" -o /dev/null
このソリューションはHEADではなくHTTPGETを実行するため、より多くのデータを転送しますが、より「純粋な」結果が得られることに注意してください。 HEADを使用して帯域幅を節約したい場合は、curlの-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