使用 ant 部署到 tomcat:如何知道应用程序何时重新加载?

Deploying to tomcat with ant: how to know when the application is reloaded?

我的 Spring MVC 应用程序的当前 ant 构建过程,部署到 tomcat 7,如下(每个步骤都是一个目标):

  1. 将网站置于维护模式(这会指示服务器上的 nginx 显示静态 "maintenance" 页面而不是加载 tomcat 应用程序)
  2. 复制war到web服务器,webapps目录下
  3. 等待 tomcat 重新加载应用程序
  4. 将站点恢复到生产模式(即恢复点 1)

我的问题是目标3;我必须手动观察 tail -f /var/log/tomcat7/catalina.out 的输出,直到它显示消息说应用程序已重新加载。然后我必须手动启动目标做第 4 点。

蚂蚁本身是否有办法解析 tail -f 的输出,并且当出现特定消息时,停止任务编号 3 并自动继续执行任务编号 4?

注意:我仍然希望在控制台中看到 tail -f 的输出(如果有错误,调试信息很有用),我只是希望它停止并转到下一个目标如果一切正常加载。

编辑:

一点更新说我终于找到了一个令人满意的解决方案。以下 ant 目标将跟踪 catalina.out 文件,在控制台中打印行并在输出中出现 "Servlet context initialized" 字样时退出命令(这是我的应用程序打印到系统输出的消息它被初始化)。

<target name="tail catalina.out DEV until restart" depends="Get credentials for DEV">
    <property name="tailtime" value="4" />
    <sshexec host="${dev}" username="${username}" password="${password}" command="echo ${password}| sudo -S tail --lines=1 -f /var/log/tomcat7/catalina.out | while read LOGLINE; do echo &quot;${LOGLINE}&quot;;  [[ &quot;${LOGLINE}&quot; == *&quot;Servlet context initialized&quot;* ]] &amp;&amp; echo ${password}|sudo -S pkill -u root tail; done" failonerror="false" trust="true" />
</target>

因此,在这个目标 运行 之后,我知道应用程序已启动,我可以触发下一个将网站置于生产模式的目标。

解决这个问题的非常 hack-ish 的方法是这样的:

  1. 我不知道如何在 Spring 中执行此操作,但您能否创建一些简单的 bean 并在所有重负载成功完成后强制它初始化。该 bean 可以只触及一些文件(例如 /run/shm/reload-nginx)。
  2. 每次 /run/shm/reload-nginx 修改日期更改时,inotify 都会触发您的脚本,例如通过 http://linux.die.net/man/1/inotifywait