【发布时间】:2013-06-26 04:24:30
【问题描述】:
我想让 tailf 或 tail -F 的输出,或者类似的东西在 Lua 中可用,而不会阻塞或锁定。如果文件被截断或日志旋转,程序将检测到它并返回开始。这似乎是一个 1 级问题,但对我来说看起来很奇怪。我就是想不通。有人可以分享一些代码吗?
【问题讨论】:
我想让 tailf 或 tail -F 的输出,或者类似的东西在 Lua 中可用,而不会阻塞或锁定。如果文件被截断或日志旋转,程序将检测到它并返回开始。这似乎是一个 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。
【讨论】: