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


102

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

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

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

如果curl --output / dev / null --silent --head --fail“ $ url”; 然后
  回声“ URL存在:$ url”
其他
  回显“ URL不存在:$ url”
科幻

您能否更具体地了解服务器等待响应的方式?
chepner 2012年

我将认为服务器尚未准备好,只要它不答复或确实以不同于200响应的方式答复即可。
索林2012年

Answers:


169

结合问题和chepner的答案,这对我有用:

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

10
反引号``的使用已过时。使用$( )代替。
Serge Stroobandt 2014年

6
这将是一个很好的扩展,允许在放弃之前有最长的等待时间
tkruse

为什么需要一个--head
lexicore

3
@lexicore由于此命令的主体并不有趣,因此我们仅请求头(尽管您可以包括检查服务器状态的更多信息的逻辑)。省略--head不会改变任何东西,但是如果您想对响应内容(例如status.html)执行一些逻辑,则可以更改。
Thomas Ferris Nicolaisen '02

1
我有一个特殊的情况,使用--head总是返回405。必须将其删除以使其正常工作
罗恩·哈廖夫

38

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

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如果由于某些原因请求链接超时
Enigo

16

httping对此很好。简单,干净,安静。

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

虽然/直到等是个人偏好。


2
再想一想,永远都是很长一段时间... for i in seq 60; do httping -qc1 http://myhost:myport && echo && break sleep 5 echo -n ${i}.. done
Bruce Edge

2

反引号的使用` `过时。使用$( )来代替:

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

0

有趣的难题。如果您的客户端没有访问权限或异步api,则可以尝试grep您的tcp套接字,如下所示:

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

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


-1

如果需要检查服务器是否可用,原因是否正在重启或其他原因,则可以尝试向服务器创建wget并解析响应或错误,如果服务器200甚至是404都已启动,则可以可以使用--timeout = seconds更改wget超时,您可以将超时设置为10秒,并进行循环,直到响应上的grep得到结果为止。

我不知道这是您要搜索的还是真的需要bash代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.