124

Webサーバーが応答するのを待っているbashでループを作成するにはどうすればよいですか?

「。」を出力する必要があります 約10秒ごとに、サーバーが応答を開始するまで待ちます。

更新します。このコードは、サーバーから適切な応答が得られるかどうかをテストします。

if curl --output / dev / null --silent --head --fail "$ url"; それから
  echo "URLが存在します:$ url"
そうしないと
  echo "URLは存在しません:$ url"
fi
4

7 に答える 7

212

質問とチェプナーの答えを組み合わせると、これは私にとってうまくいきました:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    printf '.'
    sleep 5
done
于 2014-01-17T15:22:12.037 に答える
58

最大試行回数を制限したかったのです。トーマスの受け入れられた答えに基づいて、私はこれを作りました:

attempt_counter=0
max_attempts=5

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    if [ ${attempt_counter} -eq ${max_attempts} ];then
      echo "Max attempts reached"
      exit 1
    fi

    printf '.'
    attempt_counter=$(($attempt_counter+1))
    sleep 5
done
于 2018-05-29T11:39:36.330 に答える
17

httpingはこれに適しています。シンプル、クリーン、静か。

while ! httping -qc1 http://myhost:myport ; do sleep 1 ; done

while/untilなどは個人的な設定です。

于 2015-04-03T17:08:37.650 に答える
2

バックティックの使用` `時代遅れです。

$( )代わりに使用してください:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
  printf '.'
  sleep 5
done
于 2014-04-18T15:35:56.490 に答える
2

このように、timeoutコマンドとtcpコマンドを組み合わせることもできます。無期限に待機するのではなく、60秒後にタイムアウトします

timeout 60 bash -c 'until echo > /dev/tcp/myhost/myport; do sleep 5; done'

于 2021-12-31T02:16:05.213 に答える
1
printf "Waiting for $HOST:$PORT"
until nc -z $HOST $PORT 2>/dev/null; do
    printf '.'
    sleep 10
done
echo "up!"

私はここからアイデアを取り入れました:https ://stackoverflow.com/a/34358304/1121497

于 2021-03-16T08:54:42.853 に答える
0

面白いパズル。クライアントにアクセスまたは非同期APIがない場合は、次のようにtcpソケットをgrepしてみてください。

until grep '***IPV4 ADDRESS OF SERVER IN REVERSE HEX***' /proc/net/tcp
do
  printf '.'
  sleep 1
done

しかし、それは1秒間隔のビジーウェイトです。おそらくそれ以上の解像度が必要です。また、これはグローバルです。そのサーバーに別の接続が確立された場合、結果は無効になります。

于 2012-08-10T15:59:05.280 に答える