2013-06-28 6 views
3

Я хотел бы сделать вывод tailf или tail -F, или что-то подобное мне доступно в Lua без блокировки или блокировки. Если файл обрезается или лог вращается, программа обнаружит его и вернется к началу. Кажется, это вопрос уровня 1, но мне кажется странным. Я просто не могу понять. Кто-нибудь может поделиться каким-то кодом?Как я могу хвост -F файла журнала (обрезать в курсе) в 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 и принудительное перенаправление 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 

Обратите внимание, что оба подхода блокируют кстати.

+0

Я хочу отслеживать файлы журнала, чтобы видеть новые сообщения, как только они будут выставлены в очередь. поэтому он должен быть неблокирующим. – ms2008

+0

@ ms2008vip Вы можете просто запустить это в другом терминале, где блокировка не должна иметь значения. – greatwolf

+0

hehe Спасибо. Строго говоря, решения, о которых вы говорили, только первый может быть сработал, а другой - никогда. Я бы предпочел что-то более элегантное, например, какое-то неблокируемое чтение или inotify. – ms2008