等到tomcat完成启动

时间:2008-12-17 22:27:49

标签: java linux tomcat

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

8 个答案:

答案 0 :(得分:39)

可能有几种方法可以做到这一点。我们使用的技巧是:

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

希望这有帮助!

答案 1 :(得分:8)

实施programaticaly并不困难。你可以实现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只雄猫之间的某些事情可能有所不同。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

取决于你完成的意思。你还想等什么?

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

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

答案 4 :(得分:0)

没有一种简单的方法。就startup.sh和catalina.sh而言,tomcat在完成时就会运行。虽然在内部,tomcat仍在初始化并启动上下文。

知道你是否试图找出你的上下文是否已经完成加载,或者你是否只想要一个通用,这将有所帮助,“虽然你的上下文可能没有被完全加载,但Tomcat仍在运行......”

如果是后者,您可以创建一个Web应用程序,它只有一个上下文侦听器,它将使用Runtime执行脚本。如果您很方便,可以通过web.xml文件配置webapp,以接受指向要执行的脚本的参数。

答案 5 :(得分:0)

就个人而言,我会根据你的设置和你想要的确切阶段来观察catalinas日志中的特定字符串。

答案 6 :(得分:0)

如果来自远程服务器的tomcat启动进行系统检查,我需要从jenkins进行测试。

until [[ `ssh -o StrictHostKeyChecking=no root@${DEPLOY_HOST} 'netstat -tulpn | grep 8005'` != "" ]] ; do echo "waiting for tomcat"; sleep 6; done

答案 7 :(得分:0)

我使用tomcat中的jenkins管道脚本中的以下代码完成了它。 在我打电话之前

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