2016-04-07 8 views
0

Я на самом деле Наблюдаю за каталогом для создания новых файлов (.log-файлов), эти файлы сгенерированы каким-то инструментом, а инструмент записывает записи журнала через некоторое время создание того же файла, за это время файл будет пустым.Как я могу подождать, пока что-то не будет записано в файл журнала в моем скрипте perl

и как я могу ждать, пока что-то записывается в журнал и разум, основываясь на записях журнала я буду ссылаться другого скрипта !,

use strict; 
use warnings; 
use File::Monitor; 
use File::Basename; 
my $script1 = "~/Desktop/parser1.pl"; 
my $scrip2t = "~/Desktop/parser2.pl"; 
my $dir = "~/Desktop/tool/logs"; 
sub textfile_notifier { 
my ($watch_name, $event, $change) = @_; 

my @new_file_paths = $change->files_created; #The change object has a property called files_created, 
              #which contains the names of any new files 
for my $path (@new_file_paths) { 
    my ($base, $fname, $ext) = fileparse($path, '.log'); # $ext is "" if the '.log' extension is 
                 # not found, otherwise it's '.log'. 
    if ($ext eq '.log') { 
     print "$path was created\n"; 
     if(-z $path){ 
     # i need to wait until something is written to log 
     }else{ 
     my @arrr = `head -30 $path`; 
     foreach(@arr){ 
     if(/Tool1/){ 
      system("/usr/bin/perl $script1 $path \&"); 
     }elsif(/Tool1/){ 
     system("/usr/bin/perl $script2 $path \&"); 
     } 
    } 
} 
} 
my $monitor = File::Monitor->new(); 
$monitor->watch({ 
name  => $dir, 
recurse  => 1, 
callback => {files_created => \&textfile_notifier}, #event => handler 
}); 
$monitor->scan; 

while(1){ 
    $monitor->scan; 
} 

В основном я оглавлению часть важной информации из журналы.

+0

Вы читали что-то о опросе через дескрипторы файлов? – red0ct

+0

@ red0ct Нет! ссылка на такую ​​информацию будет полезна – Shantesh

+1

Может ли [Файл :: Монитор] (http://search.cpan.org/~andya/File-Monitor-1.00/lib/File/Monitor.pm) быть разумным вариантом? – eballes

ответ

0

Вы контролируете создание файла журнала. Возможно, вы могли бы использовать функцию сна внутри ответчика, чтобы дождаться записи файла журнала. Вы также можете отслеживать изменения файлов, так как некоторые файлы журналов могут быть расширены.

3

Для такой формулировки вашего вопроса, то, как это может помочь вам:

use File::Tail; 
# for log file $logname 
my @logdata; 
my $file = File::Tail->new(name => $logname, maxinterval => 1); 
while (defined(my $newline = $file->read)) { 
    push @logdata, $newline; 
    # the decision to launch the script according to data in @logdata 
} 

Подробнее here