使用 ant 部署到 tomcat:如何知道应用程序何时重新加载?
Deploying to tomcat with ant: how to know when the application is reloaded?
我的 Spring MVC 应用程序的当前 ant 构建过程,部署到 tomcat 7,如下(每个步骤都是一个目标):
- 将网站置于维护模式(这会指示服务器上的 nginx 显示静态 "maintenance" 页面而不是加载 tomcat 应用程序)
- 复制war到web服务器,webapps目录下
- 等待 tomcat 重新加载应用程序
- 将站点恢复到生产模式(即恢复点 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 "${LOGLINE}"; [[ "${LOGLINE}" == *"Servlet context initialized"* ]] && echo ${password}|sudo -S pkill -u root tail; done" failonerror="false" trust="true" />
</target>
因此,在这个目标 运行 之后,我知道应用程序已启动,我可以触发下一个将网站置于生产模式的目标。
解决这个问题的非常 hack-ish 的方法是这样的:
- 我不知道如何在 Spring 中执行此操作,但您能否创建一些简单的 bean 并在所有重负载成功完成后强制它初始化。该 bean 可以只触及一些文件(例如 /run/shm/reload-nginx)。
- 每次 /run/shm/reload-nginx 修改日期更改时,inotify 都会触发您的脚本,例如通过 http://linux.die.net/man/1/inotifywait
我的 Spring MVC 应用程序的当前 ant 构建过程,部署到 tomcat 7,如下(每个步骤都是一个目标):
- 将网站置于维护模式(这会指示服务器上的 nginx 显示静态 "maintenance" 页面而不是加载 tomcat 应用程序)
- 复制war到web服务器,webapps目录下
- 等待 tomcat 重新加载应用程序
- 将站点恢复到生产模式(即恢复点 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 "${LOGLINE}"; [[ "${LOGLINE}" == *"Servlet context initialized"* ]] && echo ${password}|sudo -S pkill -u root tail; done" failonerror="false" trust="true" />
</target>
因此,在这个目标 运行 之后,我知道应用程序已启动,我可以触发下一个将网站置于生产模式的目标。
解决这个问题的非常 hack-ish 的方法是这样的:
- 我不知道如何在 Spring 中执行此操作,但您能否创建一些简单的 bean 并在所有重负载成功完成后强制它初始化。该 bean 可以只触及一些文件(例如 /run/shm/reload-nginx)。
- 每次 /run/shm/reload-nginx 修改日期更改时,inotify 都会触发您的脚本,例如通过 http://linux.die.net/man/1/inotifywait