2013-06-28 34 views
3

我想輸出tailftail -F,或類似的東西可以在Lua中使用,而不會阻塞或鎖定。如果文件被截斷或日誌旋轉,程序將檢測到它並返回到開始。這似乎是一個1級的問題,但對我來說看起來很奇怪。我無法弄清楚。有人可以分享一些代碼嗎?如何在lua中查找日誌文件(截斷感知)?

回答

0

想到兩個想法,您可以將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並強制stderrstdin重定向。然後可以使用任何標準模式匹配器來檢查尾部截斷。

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 

請注意,這兩種方法都阻止順便說一句。

+0

我想監視日誌文件,以便在排入隊列後立即看到新消息。所以它需要是非阻塞的。 – ms2008

+0

@ ms2008vip您可以在阻塞無關緊要的其他終端實例上運行此操作。 – greatwolf

+0

呵呵謝謝。嚴格地說,你提到的解決方案,只有第一個可以工作,而另一個永遠不會。我更喜歡一些更優雅的東西,比如某種非阻塞閱讀或者inotify。 – ms2008