124

如何在等待网络服务器响应的bash中创建一个循环?

它应该打印一个“。” 每 10 秒左右,并等待服务器开始响应。

更新,此代码测试我是否从服务器获得了良好的响应。

if curl --output /dev/null --silent --head --fail "$url"; 然后
  echo "URL 存在:$url"
别的
  echo "网址不存在:$url"
菲
4

7 回答 7

212

将问题与chepner的回答结合起来,这对我有用:

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

而/直到等是个人偏好。

于 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,您可以尝试像这样 grepping 您的 tcp 套接字:

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

但这是一个间隔为 1 秒的繁忙等待。您可能需要更多的分辨率。这也是全球性的。如果与该服务器建立了另一个连接,则您的结果无效。

于 2012-08-10T15:59:05.280 回答