Как я могу использовать -F файл журнала (с учетом усечения) в lua?

Я хотел бы сделать вывод tailf или tail -F или что-то подобное доступным для меня в Lua без блокировки или блокировки. Если файл усекается или журнал ротируется, программа обнаружит это и вернется к началу. Кажется, это вопрос уровня 1, но мне он кажется странным. Я просто не могу понять это. Кто-нибудь может поделиться кодом?


person ms2008    schedule 28.06.2013    source источник


Ответы (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.

person greatwolf    schedule 29.06.2013
comment
Я хочу отслеживать файлы журналов, чтобы видеть новые сообщения, как только они будут поставлены в очередь. поэтому он должен быть неблокирующим. - person ms2008; 29.06.2013
comment
@ ms2008vip Вы можете просто запустить это на другом экземпляре терминала, где блокировка не имеет значения. - person greatwolf; 29.06.2013
comment
хехе Спасибо. Строго говоря, из упомянутых вами решений можно было сработать только первое, а второе — никогда. Я бы предпочел что-то более элегантное, например, неблокирующее чтение или inotify. - person ms2008; 29.06.2013
comment
В этом случае вам, вероятно, придется использовать внешнюю библиотеку, например luaposix. Сам Lua не предоставляет никаких других средств для этого. - person greatwolf; 29.06.2013