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