【问题标题】:Automatically stop "tail -f catalina.out" when exception found or server is running发现异常或服务器正在运行时自动停止“tail -f catalina.out”
【发布时间】:2012-05-31 15:42:48
【问题描述】:

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

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

部署脚本会这样做:

  1. 从源代码库构建可部署的应用程序
  2. 停止 tomcat
  3. 应用数据库迁移补丁
  4. 在tomcat中部署war文件
  5. 启动 tomcat(通过调用 $TOMCAT_HOME/bin/startup.sh)
  6. 退出并显示成功消息

一切正常,而且非常整洁 - 但需要一点改进。 您会看到,即使它退出并显示成功消息,有时部署也不会成功,因为 Web 应用程序没有正确启动。

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

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

我知道这应该是可能的,如果不是在 shell 脚本中,也许是 python。 问题是我是一名 Java 专家——所谓专家,我的意思是我在其他所有方面都很糟糕 :-)

请帮忙? :-)

【问题讨论】:

  • 看Python的subprocess.Popen
  • 据我所知,您可能想tail -f localhost..log,有些异常会出现在那里而不是 catalina.out。我的环境确实如此,我不知道为什么。
  • tail -f 基本上在文件上运行一个无限循环,脚本应该只是 exec 成功还是你的意思是 tail 并成功退出?
  • 虽然 Popen 可用于扫描 tail -f 的输出,但使用 python 的文件访问功能可能更容易,例如这里:tail-f-in-python
  • 谢谢snies。解决了它(stackoverflow.com/questions/4417962/…

标签: java python shell tail


【解决方案1】:

也许是这样的?

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

【讨论】:

  • 抱歉,我缺乏了解第一个脚本应该做什么的 shell 脚本知识 :-)
  • 它提取最后 200 行(相当随意的数字,根据季节调整)并用 greps 查找其中的错误消息。
【解决方案2】:

作为替代方案,您可能想查看Apache Tomcat Manager 应用程序。除其他外,它还支持:

  • 从本地路径远程部署应用程序
  • 列出当前部署的应用程序
  • 重新加载现有应用程序
  • 启动现有应用程序
  • 停止现有应用程序
  • 取消部署现有应用程序

管理器提供了一个可以通过curl 调用的Web 界面,它返回简单的、可解析的消息来指示调用命令的状态。也可以通过 JMX 或 Ant 脚本调用管理功能。总而言之,一个非常方便的工具。

【讨论】:

    【解决方案3】:

    按照@snies 的建议,我最终使用 Python 的 subprocess.Popen 实现了一个解决方案。

    它是这样的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 2022-12-08
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多