如何在 bash 中创建一个等待 webserver 响应的循环?

如何在 bash 中创建一个等待 webserver 响应的循环?

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

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

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

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

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

但这是一个忙碌的等待与1秒钟的间隔。你可能想要更高的分辨率。而且这是全球性的。如果与该服务器建立了另一个连接,则结果无效。

把这个问题和 Chepner 的回答结合起来,这个方法对我很有效:

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

反勾的使用 ` `过时了

改为使用 $( ):

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

Httping 很适合这个,简单,干净,安静。

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

而[直到等等]是个人喜好。

我想要限制尝试的最大次数,基于托马斯接受的答案,我做了这样的决定:

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
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

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

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

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

curl --head -X GET --retry 5 --retry-connrefused --retry-delay 1 http://myhost:myport

以下片段:

  • 等待,直到参数中的所有 URL 返回200
  • 如果一个 URL 不可用,则在30秒后过期
  • 一个 curl 请求3秒后超时

只需将它放入一个文件中,并像使用通用脚本一样等待,直到所需的服务可用。

#/bin/bash


##############################################################################################
# Wait for URLs until return HTTP 200
#
# - Just pass as many urls as required to the script - the script will wait for each, one by one
#
# Example: ./wait_for_urls.sh "${MY_VARIABLE}" "http://192.168.56.101:8080"
##############################################################################################


wait-for-url() {
echo "Testing $1"
timeout --foreground -s TERM 30s bash -c \
'while [[ "$(curl -s -o /dev/null -m 3 -L -w ''%{http_code}'' ${0})" != "200" ]];\
do echo "Waiting for ${0}" && sleep 2;\
done' ${1}
echo "${1} - OK!"
}


echo "Wait for URLs: $@"


for var in "$@"; do
wait-for-url "$var"
done

要点: https://gist.github.com/eisenreich/195ab1f05715ec86e300f75d007d711c