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

sor*_*rin 89 bash

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

它应该打印一个"." 每10秒钟左右,等到服务器开始响应.

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

if curl --output /dev/null --silent --head --fail "$url"; then
  echo "URL exists: $url"
else
  echo "URL does not exist: $url"
fi

Tho*_*sen 142

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

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

  • 使用反引号``[已过时](http://unix.stackexchange.com/a/5782/39845).请改用$()`. (9认同)
  • 在放弃之前允许最长等待时间是一个很好的扩展 (5认同)
  • 我有一个特定的情况,使用“--head”总是返回“405”。必须将其删除才能使其正常工作 (4认同)
  • @lexicore由于正文对此命令不感兴趣,我们只请求头部(尽管您可以包含逻辑来检查有关服务器状态的更多内容).抛出`--head`不会改变任何东西,但是你可以在响应内容上运用一些逻辑(比如status.html). (3认同)
  • 顺便说一句,看起来不建议使用“$()”,因为它会执行输出。至少我的 IDE 对此发出了警告。如果你删除 `$()` 它应该可以工作,对吧? (2认同)

ill*_*nan 31

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

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
Run Code Online (Sandbox Code Playgroud)

  • 如果由于某些原因请求的链接超时,我建议添加 `--max-time 5` (2认同)

twi*_*kes 23

海报询问了有关打印的具体问题.,但我认为大多数人来这里都是在寻找下面的解决方案,因为它是支持有限重试的单个命令。

curl --head -X GET --retry 5 --retry-connrefused --retry-delay 1 http://myhost:myport
Run Code Online (Sandbox Code Playgroud)


Bru*_*dge 11

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

while ! httping -qc1 http://myhost:myport ; do sleep 1 ; done
Run Code Online (Sandbox Code Playgroud)

而/等等是个人的首选.

  • 在第二个想法,永远是一个很长的时间...`对于我在`seq 60`; 做httping -qc1 http:// myhost:myport && echo && break sleep 5 echo -n $ {i} ..完成` (2认同)