【问题标题】:Shellscript to monitor a log file if keyword triggers then execute a command?如果关键字触发然后执行命令,Shell 脚本来监视日志文件?
【发布时间】:2010-12-02 03:10:53
【问题描述】:

有没有便宜的方法来监控tail -f log.txt之类的日志文件,然后如果出现[error]之类的东西,执行命令?

谢谢。

【问题讨论】:

    标签: linux logfiles shell


    【解决方案1】:
    tail -fn0 logfile | \
    while read line ; do
            echo "$line" | grep "pattern"
            if [ $? = 0 ]
            then
                    ... do something ...
            fi
    done
    

    【讨论】:

    • 哦,还有一件事,tail -fn0 logfile 似乎已经过期,因为 HTTP 服务器日志文件很快被重命名并压缩了。我认为该脚本仍在监视旧文件描述符?有没有办法在tail命令一段时间后自动更新文件inode或其他东西?
    • 只需在tail命令中添加--retry,或者使用-F而不是-f。应该这样做。
    • 还可以考虑grep -q设置返回码而不显示匹配行。
    • 这个问题是,像 catalina,out (apache) 这样的日志有历史,所以“完成”有点模式已经存在。有没有办法只检查未来的日志?
    【解决方案2】:

    我还发现你可以使用 awk 来监控模式并在发现模式时执行一些操作:

    tail -fn0 logfile | awk '/pattern/ { print | "command" }'
    

    当在日志​​中找到模式时,这将执行命令。命令可以是任何 unix 命令,包括 shell 脚本或其他任何东西。

    【讨论】:

      【解决方案3】:

      更强大的方法是monit。这个工具可以监控很多事情,但其中之一是它可以轻松地跟踪一个或多个日志,匹配正则表达式,然后触发脚本。如果您要监视一组日志文件或要触发多个事件,这将特别有用。

      【讨论】:

        【解决方案4】:

        更好更简单:

        tail -f log.txt | egrep -m 1 "error"
        echo "Found error, do sth."
        ...
        

        【讨论】:

        • 感谢您提供此代码 sn-p,它可能会提供一些即时帮助。一个正确的解释would greatly improve 它的教育价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有类似但不相同的问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-06
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-01
        相关资源
        最近更新 更多