我为我的网络应用程序设置了一个自动部署脚本(在shell脚本中)。
它使用java,tomcat,maven和postgres数据库。
部署脚本执行此操作:
一切正常,而且非常整洁 - 但需要一点改进。 您会看到,即使它以成功消息退出,有时部署也不成功,因为Web应用程序无法正常启动。
我想重构步骤5和6,以便在启动tomcat服务器之后,部署脚本将在catalina.out文件中“tail -f”,查找“服务器已成功启动”消息或异常堆栈跟踪。
到那时为止的tail -f输出应该是部署脚本输出的一部分,而步骤6将相应地“退出0”或“退出1”。
我知道这应该是可能的,如果不是在shell脚本中,可能是python。 问题是我是一名java专家 - 专家我的意思是我吮吸其他一切: - )
请帮忙吗? : - )
答案 0 :(得分:0)
也许是这样的?
tmp=$(mktemp -t catalina.XXXXXXX) || exit 136
trap 'rm "$tmp"' 0
trap 'exit 255' 2 15
tail -n 200 catalina.out >"$tmp"
if grep -q error "$tmp"; then
cat "$tmp"
exit 1
fi
exit 0
另一方面,如果startup.sh
被完全编码,你可以
if startup.sh; then
tail -f catalina.out
else
exit $?
fi
可以缩短为
startup.sh || exit $?
tail -f catalina.out
答案 1 :(得分:0)
作为替代方案,您可能需要查看Apache Tomcat Manager应用程序。除其他外,它支持:
管理器提供了一个可以通过curl
调用的Web界面,它返回简单的可解析消息以指示调用命令的状态。管理功能也可以通过JMX或Ant脚本调用。总而言之,这是一个非常方便的工具。
答案 2 :(得分:0)
我最终使用Python的subprocess.Popen实现了一个解决方案,正如@snies所建议的那样。
这是它的样子:
<强> waitForIt.py 强>
#! /usr/bin/env python
import subprocess
import sys
def main(argv):
filename = argv[1]
match=argv[2]
p = subprocess.Popen(['tail', '-n', '0', '-f', filename], stdout=subprocess.PIPE)
while True :
line = p.stdout.readline()
print line ,
if match in line :
break
p.terminate()
if __name__ == "__main__":
main(sys.argv)
<强> tailUntil.sh 强>
#!/bin/bash
set -e
filename=$1
match=$2
thisdir=$(dirname $0)
python $thisdir/waitForIt.py "$filename" "$match"
然后
<强> startTomcat.sh 强>
${TOMCAT_HOME}/bin/startup.sh
logDeploy.sh "Agora vamos dar um tail no catalina.out..."
util_tailUntil.sh "$TOMCAT_HOME/logs/catalina.out" 'INFO: Server startup in '
它没有按照我原先的意图行事(即使存在堆栈跟踪,它仍会以返回码0退出 - 但可以通过更多的Python魔法来改变), 但tomcat的所有初始化日志都是自动部署的一部分(并且可以在Jenkins的部署工作中轻松查看) - 这样就够了。