【问题标题】:How can I tail -F a log file(truncate aware) in lua?如何在lua中tail -F一个日志文件(截断感知)?
【发布时间】:2013-06-26 04:24:30
【问题描述】:

我想让 tailftail -F 的输出,或者类似的东西在 Lua 中可用,而不会阻塞或锁定。如果文件被截断或日志旋转,程序将检测到它并返回开始。这似乎是一个 1 级问题,但对我来说看起来很奇怪。我就是想不通。有人可以分享一些代码吗?

【问题讨论】:

    标签: lua tail inotify


    【解决方案1】:

    想到了两个想法,您可以将tail -F 的输出直接通过管道传输到您的脚本执行中。从那里您可以从stdin 阅读它。也许是这样的:

    local c = 0
    for line in io.stdin:lines() do
      c = c + 1
      print(c, line)
    end
    

    一个问题是tail 使用stderr 报告文件截断,因此除非您找到某种方法将stderr 重定向到stdin,否则脚本不会看到它。

    另一个想法是在主循环之前使用io.popen 并强制stderr->stdin 重定向。然后,您可以使用任何标准模式匹配器来检查尾部截断。

    local tailin = io.popen('tail -F '..(...)..' 2>&1', 'r')
    
    local c = 0
    for line in tailin:lines() do
      c = c + 1
      print(c, line)
      c = line:match 'truncated' and 0 or c
    end
    

    请注意,这两种方法都在阻塞 btw。

    【讨论】:

    • 我想监控日志文件,以便在新消息入队后立即查看。所以它需要是非阻塞的。
    • @ms2008vip 你可以在不同的终端实例上运行它,阻塞应该无关紧要。
    • 呵呵谢谢。严格来说,你提到的解决方案,只有第一个可以工作,另一个永远不会。我更喜欢更优雅的东西,比如某种非阻塞读取或 inotify。
    • 在这种情况下,您可能不得不使用像 luaposix 这样的外部库。 Lua 本身并没有为此提供任何其他工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多