繁体   English   中英

在Bash脚本中使用Curl检查网站是否正常运行

[英]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') 您可以在此处阅读有关subshel​​l优于反引号的优点。

脚本如下所示:

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的条件中都缺少$来替换命令。

但是除此之外,我将对此有所不同。

untilwhile命令仅执行命令作为其“条件”。 在许多情况下,命令是[ (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"

注意事项...

  • 我将curl选项移动到一个数组中。 对于诸如curl之类的东西,它有无数种选择,这确实可以帮助进行命令行管理。
  • 使用$start$dur变量添加了一个计时器。 您实际上并不需要$dur ,但是在这里使用变量会使事情更容易阅读。
  • 在“请稍候”消息中添加了日期戳。 您甚至可能要重新计算$dur以包括在此消息中,以防Tomcat花费比预期启动更长的时间。

您想要获取curl命令管道的输出以便将其与“”进行比较。 为此,您需要将卷曲管用反引号而不是双引号引起来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM