web-dev-qa-db-ja.com

curlよりもURLにpingを実行する高速な方法

指定されたURLが機能しているかどうかを確認する最も速い方法は何でしょうか? (OK httpステータスコードで応答)?

現時点ではcurlを使用していますが、ループでテストするURLがたくさんあるので、最速の解決策を探しています。

Wget以外にチェックするオプションはありますか?

5
Sfisioza

パフォーマンスの向上は、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を処理している場合は、結局のところ、最初のソリューションでそれらをラップすることをお勧めします。

8
ghoti

たぶんNetcatを使用しますか?

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


EOF

出力:

HTTP/1.1 200 OK
1
moebius_eye