部署到tomcat 7的Spring MVC应用程序的当前ant构建过程如下(每个步骤都是一个目标):
- 将网站置于维护模式(这指示服务器上的nginx显示一个静态的"维护"页面,而不是加载tomcat应用程序)
- 将war复制到webapps目录下的web服务器
- 等待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>
因此,在这个目标运行后,我知道应用程序已经启动,我可以启动下一个目标,使站点进入生产模式。
解决这个问题的非常破解的方法是这样的:
- 我不知道如何在Spring中做到这一点,但你能创建一些简单的bean,并在所有重负载成功完成后强制它初始化吗。该bean可能只是接触了一些文件(例如/run/shm/reload-nginx)
- 每次/run/shm/reload nginx修改日期更改时,inotify都会触发您的脚本,例如通过http://linux.die.net/man/1/inotifywait