2012-11-20 3 views
1

PID가 perl에서 살아있을 때까지 로그 파일을 검사해야한다는 요구 사항이 있습니다. bash에서 잘 작동합니다. 꼬리 PID가있는 펄의 파일

tail -f --pid=1234 logfile.log 

는 지금은 PID를 확인하거나 또한 나를 위해 작동 시간 간격을 제공하여 로그 파일 중 하나를 확인하기 위해 펄 함께 할 동일해야합니다.

나는 perl에서 다음 코드를 사용하고 있지만 파일을 꼬리 수 있으며 두 가지 문제가 있습니다.

1) 파일의 꼬리가 즉시 발생하지 않습니다.

2)가 몇 초 후에 꼬리를 닫으려면, 나는 위의 코드를 사용하고 그것은 단지 2 초에 종료된다 (100)

use warnings; 
use strict; 
use File::Tail; 
my $name='/tmp/out'; 
my $file=File::Tail->new(name=>$name,interval=>1,maxinterval=>5,adjustafter=>1); 
my ($found,$timeleft,@pending) = File::Tail::select(undef,undef,undef,100,$file); 

if ($found) 
{ 
    print $pending[0]->read; 
} 

을 말한다. 주어진 꼬리표를 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬박 꼬리표 명령과 같은 파일을 찾으러 나왔습니다

감사합니다. the documentation에서

+2

: 여기가 전체 시간 간격 동안 계속됩니다 루핑 솔루션을 무엇입니까? 발생한 문제는 무엇입니까? 당신의 실제 질문은 무엇입니까? 우리는 "plz 내 코드 작성"사이트가 아닙니다. –

+0

다음 코드를 사용하여 perl에서 수행하고 있지만 파일을 꼬리 수 있고 두 가지 문제가 있습니다. 1) 파일 꼬리가 즉시 발생하지 않습니다. 2) 몇 초 후에 말을 닫고 싶습니다. 예를 들어 100이라고 말하십시오. 'File :: Tail; $ name = '/ tmp/out'; $ file = File :: Tail-> new (name => $ name, interval => 1, adjustafter => 1); while (정의 ($ line = $ file-> read)) { print "$ line"; }' –

+3

원래 질문을 수정하고 거기에 코드를 입력하십시오.문제에 대한 새로운 정보를 항상 최신 상태로 유지하십시오. –

답변

1

:

모듈은 약간의 트래픽이 파일에 "바쁜 대기"로하지 열심히하려고합니다. 파일에서 새 데이터를 읽을 때마다 새 줄 수를 계산하고 그 전에 파일에 데이터가 마지막으로 기록 된 이후에 이 경과 한 시간으로 해당 숫자를 나눕니다. 즉, 새로운 데이터가 작성되기 전의 평균 시간으로 간주되는 입니다. 읽을 새 데이터가 없으면 File :: Tail은 초에 해당하는 시간 동안 대기합니다. 그 후 대기 시간은 동적으로 다시 계산됩니다. File :: Tail은 maxinterval에 의해 으로 설정된 시간 (초) 이상 동안 절전 모드가되지 않습니다.

업데이트를 즉시보고 싶다면 maxinterval을 낮은 숫자로 설정해야합니다.

업데이트 : 업데이트 : select 이 간단한 예제는 파일에 대해 100 초의 단일 검사를 수행합니다. 또한 적어도 5 초마다 파일을 검사합니다. 루프를 사용하는보다 복잡한 예제는 앞서 언급 한 설명서를 참조하십시오.

use warnings; 
use strict; 
use File::Tail; 
my $name='/tmp/out'; 
my $file=File::Tail->new(name=>$name,interval=>1,maxinterval=>5,adjustafter=>1); 
my ($found,$timeleft,@pending) = File::Tail::select(undef,undef,undef,100,$file); 

if ($found) 
{ 
    print $pending[0]->read; 
} 

업데이트 : 지금까지 시도 무엇

use warnings; 
use strict; 
use File::Tail; 
my $name='/tmp/out'; 
my $file=File::Tail->new(name=>$name,interval=>1,maxinterval=>5,adjustafter=>1); 

my $time = 60; 

while ($time > 0) 
{ 
    my ($found,@pending); 
    ($found,$time,@pending) = File::Tail::select(undef,undef,undef,$time,$file); 

    if ($found) 
    { 
     print $_->read for @pending; 
    } 
} 
+0

잘 돌아가고 있지만, 꼬리말에 60 초 동안 파일을 넣고 싶다면 위의 코드에서 매개 변수를 변경해야합니다. –

+0

@harsha 위의 select 호출에서'100'은 초 단위로 기다리는 최대 시간이므로 60 초로 변경하십시오. 변경 사항을 감지하더라도 60 초 동안 기다려야하는 경우 루프 논리를 추가해야합니다. 그것이 사실인지 알려주세요. – dan1111

+0

2 ~ 3 초 동안 만 콘텐츠를 표시하고 종료합니다. 하지만 실제로 꼬리는 리눅스 tailf 명령과 같은 특정 파일을 찾고 있는데요. –