【发布时间】:2010-09-27 10:30:31
【问题描述】:
我有一个脚本需要在 tomcat 完成启动并准备开始部署应用程序后运行。我正在使用立即返回的$TOMCAT_HOME/bin/startup.sh。如何等到 tomcat 完成启动?
【问题讨论】:
我有一个脚本需要在 tomcat 完成启动并准备开始部署应用程序后运行。我正在使用立即返回的$TOMCAT_HOME/bin/startup.sh。如何等到 tomcat 完成启动?
【问题讨论】:
可能有几种方法可以做到这一点。我们使用的技巧是:
#!/bin/bash
until [ "`curl --silent --show-error --connect-timeout 1 -I http://localhost:8080 | grep 'Coyote'`" != "" ];
do
echo --- sleeping for 10 seconds
sleep 10
done
echo Tomcat is ready!
希望这会有所帮助!
【讨论】:
curl --silent --write-out '%{response_code} -o /dev/null '[url]'。这会为您提供响应代码,您可以将其与[ 一起使用来测试您认为合适的任何值。您可能还想限制重定向。
--max-time 而不是--connect-time,因为Tomcat 可以连接但还没有准备好传递页面。
以编程方式实现并不难。你可以实现 org.apache.catalina.LifecycleListener 然后你就拥有了
public void lifecycleEvent(LifecycleEvent lifecycleEvent) {
if(lifecycleEvent.getType().equals(Lifecycle.START_EVENT))
//do what you want
}
}
在 web.xml 中:
<Context path="/examples" ...>
...
<Listener className="com.mycompany.mypackage.MyListener" ... >
...
</Context>
请注意,6-9 只 Tomcat 之间有些东西可能会有所不同。
【讨论】:
您还在寻找答案吗?这取决于您对开始的定义。如果您对启动的定义是“现在可以安全停止”,那么您可能需要验证端口 8005 是否正在侦听。
【讨论】:
取决于你所说的完成是什么意思。你还想等什么?
例如,您可以有一个脚本反复访问一个 URL,直到它得到一个理想的结果,该结果只有在应用程序正确初始化后才可用。
您还可以有一个上下文侦听器,它会写出一个“我准备好了”文件,您可以使用该文件来表示您的应用程序已准备就绪。 (如果您这样做,请确保在启动您的应用容器之前该文件不存在)。
【讨论】:
我需要这个来测试来自 jenkins 的远程服务器的 tomcat 是否启动了系统检查。
until [[ `ssh -o StrictHostKeyChecking=no root@${DEPLOY_HOST} 'netstat -tulpn | grep 8005'` != "" ]] ; do echo "waiting for tomcat"; sleep 6; done
【讨论】:
没有简单的方法。就startup.sh和catalina.sh而言,tomcat完成后就在运行。尽管在内部,tomcat 仍在初始化和启动上下文。
如果您想知道您的上下文是否已完成加载,或者您只是想要一个通用的“Tomcat 正在运行,尽管您的上下文可能没有完全加载...”,这将有所帮助。
如果是后者,您可以创建一个 Web 应用程序,该应用程序仅具有一个上下文侦听器,该侦听器将使用运行时执行脚本。如果您方便的话,您可以通过 web.xml 文件使 webapp 可配置,以接受指向要执行的脚本的参数。
【讨论】:
就个人而言,我会根据您的设置方式和您正在寻找的确切阶段查看特定字符串的 catalinas 日志。
【讨论】:
我已经用 jenkins pipelinescript 中的以下代码和 tomcat 完成了它。 在我打电话之前
sudo /bin/systemctl restart tomcat
并且在我的 sudoers 文件中有一个 jenkins 用户的条目。
现在这里是单线:
until [ "$(curl -w '%{response_code}' --no-keepalive -o /dev/null --connect-timeout 1 -u USERNAME:PASSWORD http://localhost:8080/manager/text/list)" == "200" ]; do echo --- sleeping for 1 second; sleep 1; done
更好的可读性:
until [ "$(curl -w '%{response_code}' --no-keepalive -o /dev/null --connect-timeout 1 -u USERNAME:PASSWORD http://localhost:8080/manager/text/list)" == "200" ];
do echo --- sleeping for 1 second;
sleep 1;
done
【讨论】: