我想在运行启动脚本时使用一种方法检查网站是否已在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"
答案 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
命令替换。
但除此之外,我会稍微改变一下。
until
或while
命令只是执行命令作为其“条件”。在许多情况下,命令是[
(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"
需要注意的一些事项......
$start
和$dur
变量添加了计时器。你真的不需要$dur
,但在这里使用变量会让事情变得更容易阅读。$dur
以包含在此消息中,以防Tomcat花费比预期更长的时间。答案 2 :(得分:0)
您希望获取curl命令管道的输出,以便将其与“”进行比较。为此,您需要将卷曲管道用反引号括起来而不是双引号。