2013-06-28 4 views
3

출력을 tailf 또는 tail -F으로 만들거나 차단 또는 잠금없이 루아에서 나에게 비슷한 것을 제공하고 싶습니다. 파일이 잘 리거나 로그가 회전되면 프로그램이이를 감지하고 시작으로 돌아갑니다. 이것은 1 단계 질문 인 것 같지만 이상하게 보입니다. 나는 그것을 이해할 수 없다. 누구든지 일부 코드를 공유 할 수 있습니까?루아에서 어떻게 로그 파일을 꼬리 끌 수 있습니까?

답변

0

두 가지 아이디어가 떠오르면 tail -F의 결과를 스크립트 실행에 직접 파이프 할 수 있습니다. 거기에서 stdin에서 읽을 수 있습니다. 이 같은 아마 뭔가 :

local c = 0 
for line in io.stdin:lines() do 
    c = c + 1 
    print(c, line) 
end 

이있는 문제는 당신이 stdinstderr를 리디렉션 할 수있는 방법을 찾을하지 않는 스크립트가 표시되지 않도록 tail 파일 자르기를보고 stderr를 사용한다는 것입니다.

다른 아이디어는 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를 차단하고 있습니다.

+0

대기열에 추가되는 즉시 새 메시지를 보려면 로그 파일을 모니터링하고 싶습니다. 따라서 비 차단이어야합니다. – ms2008

+0

@ ms2008vip 블로킹이 중요하지 않은 다른 터미널 인스턴스에서이 작업을 실행할 수 있습니다. – greatwolf

+0

안녕하세요. 엄밀히 말하면, 당신이 언급 한 해결책은 처음 일할 수 있었고 다른 일은 결코 끝날 수 없었습니다. 어떤 종류의 non-blocking 읽기 나 inotify와 같은 좀 더 우아한 것을 선호 할 것입니다. – ms2008