Java 等待tomcat完成启动

Java 等待tomcat完成启动,java,linux,tomcat,Java,Linux,Tomcat,我有一个脚本需要在tomcat完成启动并准备开始部署应用程序后运行。我使用的是立即返回的$TOMCAT_HOME/bin/startup.sh。我怎样才能等到tomcat完成启动呢?取决于您所说的完成。你想等什么 例如,你可以让一个脚本反复点击一个URL,直到它得到一个理想的结果,而这个结果只有在应用程序正确初始化后才可用 您还可以有一个上下文侦听器,它写出一个“我准备好了”文件,您可以用它来表示应用程序已经准备就绪。(如果您这样做,请在启动应用程序容器之前确保该文件不存在)。没有简单的方法。就

我有一个脚本需要在tomcat完成启动并准备开始部署应用程序后运行。我使用的是立即返回的
$TOMCAT_HOME/bin/startup.sh
。我怎样才能等到tomcat完成启动呢?

取决于您所说的完成。你想等什么

例如,你可以让一个脚本反复点击一个URL,直到它得到一个理想的结果,而这个结果只有在应用程序正确初始化后才可用


您还可以有一个上下文侦听器,它写出一个“我准备好了”文件,您可以用它来表示应用程序已经准备就绪。(如果您这样做,请在启动应用程序容器之前确保该文件不存在)。

没有简单的方法。就startup.sh和catalina.sh而言,tomcat在它们完成时正在运行。尽管在内部,tomcat仍在初始化和启动上下文

如果你想知道你的上下文是否已经加载完毕,或者你只是想要一个通用的“Tomcat正在运行,尽管你的上下文可能还没有完全加载……”,这会很有帮助


如果是后者,您可以创建一个web应用程序,该应用程序仅具有一个上下文侦听器,该侦听器将使用运行时执行脚本。如果方便的话,您可以通过web.xml文件对webapp进行配置,以接受指向要执行的脚本的参数。

可能有几种方法。我们使用的技巧是:

#!/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!

希望这有帮助

就个人而言,我会根据您的设置方式和所需的具体阶段,查看catalinas日志中的特定字符串。

通过编程实现并不困难。您可以实现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只雄猫之间可能存在一些差异。

你还在寻找答案吗?这取决于你对开始的定义。如果您对started的定义是“现在可以安全停止”,那么您可能需要验证端口8005是否正在侦听。

我需要这个从jenkins测试远程服务器的tomcat是否启动以进行系统检查


直到[[`ssh-o StrictHostKeyChecking=no root@${DEPLOY_HOST}'netstat-tulpn | grep 8005'`!=''];做回声“等待雄猫”;睡眠6;完成

我用tomcat的jenkins pipelinescript中的以下代码完成了这项工作。 在我打电话之前

sudo /bin/systemctl restart tomcat
在我的sudoers文件中有一个jenkins用户的条目

现在,我们来看一下oneliner:

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

如果您使用例如grep'302 Found'而不是grep'Coyote',那么这也可以在非Tomcat服务器上使用-例如,检查Jenkins服务器的就绪性。更好的是:使用
curl--silent--write out“{response\u code}-o/dev/null'[url]”
。这将为您提供响应代码,您可以将其与
[
测试您认为合适的任何值。您可能还想限制重定向。我使用了
--max time
,而不是
--connect time
,因为Tomcat可以连接,但还没有准备好交付页面。为什么我们需要睡眠?@user7294900如果没有睡眠,它可能会耗尽您所有的cpu,因为它会循环同样多的时间当它运行时,尽可能多的。看起来很有趣。介意解释一下这个类下一步应该做什么吗?如何将它注册到tomcat,这个代码如何与我的脚本/ant通信,等等?