2016-10-16 8 views
0

EHLO!Perl 꼬리 파일 30 초

"이봐, 나에게 30 분 줘"처럼 시작되었지만 여기에 나는 하루가 걸렸어. 기본적으로 "/ var/log/messages"를 30 초 동안 확인하고 누군가가 그 시간 동안 USB 하드 디스크를 플러그인하면 몇 가지 명령을 실행합니다.

그래서 Per 함수 "File :: Tail"을 사용하고 있습니다. 그러나 일을 끝내기 전까지는 꼬리가 거기에 머물러 있습니다 ( 꼬리 명령처럼 작동합니다.). 포크를 사용하는 솔루션을 찾고 있었지만 여전히 운이나 경험이 없습니다. 은 "꼬리"코드의 일부는 다음과 같이이다 :

while ((defined($line=$file->read))) {

내가 어떤 도움이나 팁을 주셔서 감사합니다. 다른 사람이 다른 기능이나 다른 기능을 사용하는 다른 솔루션을 가지고 있다면 괜찮습니다. "CGI"코드가 필요합니다.

+3

['alarm'] (http://perldoc.perl.org/functions/alarm.html)? – mob

+2

'$ file-> read';을 호출하기 전에'sleep (30);') – ikegami

+3

F :: T는 이것을 지원하지 않으므로 옵션은 다음과 같습니다 : 1) F와 같은 일을하는 모듈을 찾습니다 : : T는 지원하지만 타임 아웃을 지원한다. 2) Monkeypatch F :: T 3) F :: T를 재 초기화한다. (4)'alarm' 5)'/ var/log/messages를 포함하지 않는 메커니즘을 사용한다. ' – ikegami

답변

1

File::Tail::select()을 사용하여이를 수행 할 수 있습니다.

아래의 예는 테일 파일의 1 초 분량을 @pending 어레이에 넣은 다음 처리합니다. 30 회 루핑하면 30 초에 매우 가깝게됩니다 (/ var/log/messages의 활성 상태에 달려 있습니다). 더 정확한 타이밍이 필요한 경우 루프 이전의 시간을 저장하고 각 반복에서 경과 된 시간을 비교할 수 있습니다.

use File::Tail; 
$file = File::Tail->new(name=>"/var/log/messages", interval=>1); 

TIMER_LOOP: 
while($t++ < 30){ 
    (undef,undef,@pending)=File::Tail::select(undef,undef,undef, 1, $file); 
    for(@pending){ 
     if($_->read =~ /New USB device found/){ 
      print "Hello USB!\n"; 
      last TIMER_LOOP; 
     } 
    } 
}