【问题标题】:bash monitoring file with tail including ability to switch file dynamically?带有尾部的bash监视文件,包括动态切换文件的能力?
【发布时间】:2019-10-21 16:26:08
【问题描述】:

我有一个脚本,它逐行监控日志文件并将检索到的值推送到其他地方(例如,到图形应用程序)。但是,日志文件名和/或路径可能会在午夜前后发生变化,例如,由于app 日志轮换(不是unix 日志轮换)和应用程序的EOD 程序。 例如/path/to/log/20191018/log.txt下的日志文件可以切换到/path/to/log/20191019/log.txt

在脚本中处理这种情况的最佳方法是什么?例如让tail命令开始跟随一个新文件?

tail -f "$file" | while read line
do case "$line" in
        *"a_string"*) do_something 
         ;;
        ...
        ...
    esac
done

【问题讨论】:

  • 最有可能的解决方案是tail -F
  • @Kamil 谢谢我认为这可以解决名称更改,但是更改路径呢?例如。当原始文件/路径仍然存在但新日志开始写入具有相同基本名称但在不同目录下的不同文件时?
  • getting written into a different file with same basename but under a different dir - 那么,您如何检测到呢?你怎么知道日志文件在哪个文件名和目录中?为什么任何软件会在运行时更改日志文件的路径?
  • 这与您所描述的内容完全不同。请编辑您的帖子并包含此类信息。所以,inotifywait on /path/to/log 用于新目录,每次创建新目录时,切换到新日志文件。
  • 这就是为什么传统的 UNIX 日志轮换系统总是写入同一个文件,然后只是在事后 rotate 到不同的带日期戳的名称的部分原因——这样@ 987654328@ 做了正确的事,因为最近的文件名是不变的。

标签: bash shell tail


【解决方案1】:

基本问题是,就目前而言,您的脚本无法知道日志轮换已经发生。您可以将日志解析器包装在子进程中,并让父进程监视新文件的目录,但这需要一些假设,以及一些复杂的进程/文件监视逻辑。

我通常更喜欢“通知”机制而不是“轮询”机制,因此解决此问题的一个干净方法是让日志轮换机制在文件更改时重新启动您的脚本。如果您正在使用logrotate 并允许修改其配置,则只需将postrotate 条目添加到相应的配置文件即可:

/path/to/monitored/directory {
    ...
    postrotate
        /usr/bin/killall myscript
        /path/to/myscript
    endscript
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-10
    • 2018-12-29
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多