【问题标题】:Wait until tomcat finishes starting up等到tomcat完成启动
【发布时间】:2010-09-27 10:30:31
【问题描述】:

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

【问题讨论】:

    标签: java linux tomcat


    【解决方案1】:

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

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

    希望这会有所帮助!

    【讨论】:

    • 如果你使用例如grep '302 Found' 而不是 grep 'Coyote' 那么这也可以在非 Tomcat 服务器上使用 - 例如检查 Jenkins 服务器的准备情况。
    • 更好:使用curl --silent --write-out '%{response_code} -o /dev/null '[url]'。这会为您提供响应代码,您可以将其与[ 一起使用来测试您认为合适的任何值。您可能还想限制重定向。
    • 我使用了--max-time 而不是--connect-time,因为Tomcat 可以连接但还没有准备好传递页面。
    • 我们为什么需要睡眠?
    • @user7294900 没有睡眠,它可能会耗尽你所有的 CPU,因为它会在运行时循环尽可能多的次数。
    【解决方案2】:

    以编程方式实现并不难。你可以实现 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 之间有些东西可能会有所不同。

    【讨论】:

    • 看起来很有趣。介意解释一下这门课我接下来应该做什么?如何注册到tomcat,这段代码如何与我的脚本/蚂蚁通信等?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      例如,您可以有一个脚本反复访问一个 URL,直到它得到一个理想的结果,该结果只有在应用程序正确初始化后才可用。

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

      【讨论】:

        【解决方案5】:

        我需要这个来测试来自 jenkins 的远程服务器的 tomcat 是否启动了系统检查。

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

        【讨论】:

          【解决方案6】:

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

          如果您想知道您的上下文是否已完成加载,或者您只是想要一个通用的“Tomcat 正在运行,尽管您的上下文可能没有完全加载...”,这将有所帮助。

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

          【讨论】:

            【解决方案7】:

            就个人而言,我会根据您的设置方式和您正在寻找的确切阶段查看特定字符串的 catalinas 日志。

            【讨论】:

              【解决方案8】:

              我已经用 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
              

              【讨论】:

                猜你喜欢
                • 2017-06-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-01-21
                • 2011-07-16
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多