【问题标题】:How to create a loop in bash that is waiting for a webserver to respond?如何在等待网络服务器响应的 bash 中创建一个循环?
【发布时间】:2012-08-07 22:32:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您能否更具体地说明您是如何等待服务器响应的?
  • 我会认为服务器还没有准备好,只要它没有回复或者回复了不同于 200 响应的内容。

标签: bash


【解决方案1】:

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

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    printf '.'
    sleep 5
done

【讨论】:

  • 反引号``的使用是outdated。请改用$( )
  • 将是一个很好的扩展,可以在放弃前允许最长的等待时间
  • 为什么需要--head
  • @lexicore 由于该命令对主体不感兴趣,因此我们只请求头部(尽管您可以包含逻辑来检查有关服务器状态的更多内容)。省略--head 不会改变任何东西,但如果你想对响应内容(如status.html)进行一些逻辑,你可以这样做。
  • 我有一个特定的情况,使用--head 总是返回405。必须删除它才能使其工作
【解决方案2】:

我想限制最大尝试次数。根据托马斯接受的答案,我做了这个:

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

【讨论】:

  • 如果由于某些原因请求的链接超时,我建议添加--max-time 5
【解决方案3】:

httping 很适合这个。简单、干净、安静。

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

while/until etc 是个人偏好。

【讨论】:

  • 再想一想,永远是很长的时间...for i in seq 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
【解决方案4】:

反引号` `的使用是outdated

改用$( )

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
  printf '.'
  sleep 5
done

【讨论】:

    【解决方案5】:
    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

    【讨论】:

      【解决方案6】:

      有趣的谜题。如果您的客户端没有访问权限或异步 api,您可以尝试像这样 grepping 您的 tcp 套接字:

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

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

      【讨论】:

        【解决方案7】:

        你也可以像这样组合 timeout 和 tcp 命令。它将在 60 秒后超时,而不是无限期等待

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

        【讨论】:

          猜你喜欢
          • 2018-06-22
          • 2019-07-18
          • 2020-12-25
          • 2015-07-03
          • 1970-01-01
          • 1970-01-01
          • 2013-10-25
          • 2017-10-10
          • 2017-07-21
          相关资源
          最近更新 更多