[英]Using Curl in a Bash script to check if a site is up
我想结合一种方法来在运行启动脚本时检查站点是否已加载到Tomcat中,并让其告诉我Tomcat何时完全启动。 到目前为止,这就是我所拥有的。 当我单独运行curl
命令时,如果Tomcat isweb
正在运行,它将正常工作并且不显示任何数据。 但是由于某种原因,如果我在此循环中运行它,无论是否找到任何东西,它都会继续循环。 有任何想法吗?
until [ "(curl --silent --show-error --connect-timeout 1 -I http://localhost | grep 'isweb')" != "" ];
do
echo --- Tomcat is starting, please wait...
sleep 10
done
echo -e "\e[00;32mApplications are ready!\e[00m"
双引号不会产生命令的输出,它们会保留字符的文字值,但某些特殊字符除外。 您在脚本中将字符串"(curl --silent --show-error --connect-timeout 1 -I http://localhost | grep 'isweb')"
与一个空字符串进行比较的结果是,永远不会是true
。
如果将命令括在反引号(`)中,则Bash将执行该命令并评估其输出,从而产生所需的结果。
但是在Bash中更好,更现代的POSIX兼容方法是使用带有$(...)
语法的子外壳, $(curl --silent --show-error --connect-timeout 1 -I http://localhost | grep 'isweb')
。 您可以在此处阅读有关subshell优于反引号的优点。
脚本如下所示:
until [ "$(curl --silent --show-error --connect-timeout 1 -I http://localhost | grep 'isweb')" ];
do
echo --- Tomcat is starting, please wait...
sleep 10
done
请注意,为了[
才能正常工作,您需要将$(...)
语法括在双引号中,因为[
只是test
命令的简写形式,并且将带空格的命令解释为多个参数。 双引号有助于将输出保留为一个参数(如果您已开始阅读链接的内容,则将知道用$
表示的变量将被解释)。 您也不需要比较运算符,如果输出为空,则将其评估为false
。
您可能已经知道, until
的条件中都缺少$
来替换命令。
但是除此之外,我将对此有所不同。
until
或while
命令仅执行命令作为其“条件”。 在许多情况下,命令是[
(aka / bin / test)或[[
(bash中的内置功能)。 但是,对测试是否通过的评估是其退出值是零还是非零。 如果发现某些东西,grep将返回0(成功),否则将返回非零(失败)。
所以:
#!/usr/bin/env bash
declare -a curl_opts=()
curl_opts+=(-silent)
curl_opts+=(--show-error)
curl_opts+=("--connect-timeout 1")
curl_opts+=(-I)
start=$(date '+%s')
until curl "${curl_opts[@]}" http://localhost | grep -q 'isweb'; do
date '+[%Y-%m-%d %H:%M:%S] --- Tomcat is starting, please wait...'
sleep 10
done
dur=$(($(date '+%s') - start))
echo -e "\e[00;32mApplications are ready! ($dur second delay)\e[00m"
注意事项...
$start
和$dur
变量添加了一个计时器。 您实际上并不需要$dur
,但是在这里使用变量会使事情更容易阅读。 $dur
以包括在此消息中,以防Tomcat花费比预期启动更长的时间。 您想要获取curl命令管道的输出以便将其与“”进行比较。 为此,您需要将卷曲管用反引号而不是双引号引起来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.