在Bash脚本中使用Curl来检查站点是否已启动

时间:2016-01-27 03:49:35

标签: linux bash shell

我想在运行启动脚本时使用一种方法检查网站是否已在Tomcat中加载,并告诉我Tomcat何时完全启动。这就是我到目前为止所拥有的。当我运行curl命令solo时,它运行正常并且如果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"

3 个答案:

答案 0 :(得分:2)

Double quotes不生成命令的输出,它们保留字符的字面值,但某些特殊字符除外。您的脚本中发生的事情是,您将字符串"(curl --silent --show-error --connect-timeout 1 -I http://localhost | grep 'isweb')"与空字符串进行比较,而且永远不会是true

如果将命令括在反引号(`)中,Bash将执行命令并评估其输出,从而产生所需的结果。

但是,在Bash中更好,更现代的POSIX兼容方法是使用带有$(...)语法的子shell,$(curl --silent --show-error --connect-timeout 1 -I http://localhost | grep 'isweb')。您可以阅读子shell的优点而不是反引号here

这就是你的脚本的样子:

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

答案 1 :(得分:2)

您可能已经知道在$的条件下,您错过了until命令替换。

但除此之外,我会稍微改变一下。

untilwhile命令只是执行命令作为其“条件”。在许多情况下,命令是[(a.k.a。/ 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花费比预期更长的时间。

答案 2 :(得分:0)

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