3
我想輸出tailf
或tail -F
,或類似的東西可以在Lua中使用,而不會阻塞或鎖定。如果文件被截斷或日誌旋轉,程序將檢測到它並返回到開始。這似乎是一個1級的問題,但對我來說看起來很奇怪。我無法弄清楚。有人可以分享一些代碼嗎?如何在lua中查找日誌文件(截斷感知)?
我想輸出tailf
或tail -F
,或類似的東西可以在Lua中使用,而不會阻塞或鎖定。如果文件被截斷或日誌旋轉,程序將檢測到它並返回到開始。這似乎是一個1級的問題,但對我來說看起來很奇怪。我無法弄清楚。有人可以分享一些代碼嗎?如何在lua中查找日誌文件(截斷感知)?
想到兩個想法,您可以將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
請注意,這兩種方法都阻止順便說一句。
我想監視日誌文件,以便在排入隊列後立即看到新消息。所以它需要是非阻塞的。 – ms2008
@ ms2008vip您可以在阻塞無關緊要的其他終端實例上運行此操作。 – greatwolf
呵呵謝謝。嚴格地說,你提到的解決方案,只有第一個可以工作,而另一個永遠不會。我更喜歡一些更優雅的東西,比如某種非阻塞閱讀或者inotify。 – ms2008