发现异常或服务器运行时自动停止“tail -f catalina.out”

时间:2012-05-25 03:00:25

标签: java python shell tail

我为我的网络应用程序设置了一个自动部署脚本(在shell脚本中)。

它使用java,tomcat,maven和postgres数据库。

部署脚本执行此操作:

  1. 从源存储库
  2. 构建可部署的应用程序
  3. 停止tomcat
  4. 应用数据库迁移修补程序
  5. 在tomcat中部署war文件
  6. 启动tomcat(通过调用$ TOMCAT_HOME / bin / startup.sh)
  7. 以成功消息退出
  8. 一切正常,而且非常整洁 - 但需要一点改进。 您会看到,即使它以成功消息退出,有时部署也不成功,因为Web应用程序无法正常启动。

    我想重构步骤5和6,以便在启动tomcat服务器之后,部署脚本将在catalina.out文件中“tail -f”,查找“服务器已成功启动”消息或异常堆栈跟踪。

    到那时为止的tail -f输出应该是部署脚本输出的一部分,而步骤6将相应地“退出0”或“退出1”。

    我知道这应该是可能的,如果不是在shell脚本中,可能是python。 问题是我是一名java专家 - 专家我的意思是我吮吸其他一切: - )

    请帮忙吗? : - )

3 个答案:

答案 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的部署工作中轻松查看) - 这样就够了。