Я хотел бы сделать вывод tailf
или tail -F
или что-то подобное доступным для меня в Lua без блокировки или блокировки. Если файл усекается или журнал ротируется, программа обнаружит это и вернется к началу. Кажется, это вопрос уровня 1, но мне он кажется странным. Я просто не могу понять это. Кто-нибудь может поделиться кодом?
Как я могу использовать -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.
person
greatwolf
schedule
29.06.2013
Я хочу отслеживать файлы журналов, чтобы видеть новые сообщения, как только они будут поставлены в очередь. поэтому он должен быть неблокирующим.
- person ms2008; 29.06.2013
@ ms2008vip Вы можете просто запустить это на другом экземпляре терминала, где блокировка не имеет значения.
- person greatwolf; 29.06.2013
хехе Спасибо. Строго говоря, из упомянутых вами решений можно было сработать только первое, а второе — никогда. Я бы предпочел что-то более элегантное, например, неблокирующее чтение или inotify.
- person ms2008; 29.06.2013
В этом случае вам, вероятно, придется использовать внешнюю библиотеку, например luaposix. Сам Lua не предоставляет никаких других средств для этого.
- person greatwolf; 29.06.2013