PERL: чтение файла журнала и ввод строки cmd вместе - PullRequest
0 голосов
/ 24 ноября 2010

Я написал скрипт, который считывает некоторые данные из файла журнала и преобразовывает данные в более простую форму и записывает их обратно в другой файл. чтение производится построчно с задержкой в ​​5 секунд, то есть sleep (5).

Между тем, в командной строке, если пользователь вводит «suspend» (через STDIN), тогда программа переходит в спящий режим, если не введено «resume», а затем читает следующую строку.

Так как с каждой итерацией в цикле я проверяю STDIN, введен ли пользователем 'suspend' или нет.

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

Я не эксперт по Perl, и впервые пишу код на PERL. На самом деле, я никогда раньше не делал этого для разбора файлов: '- (

моя реализация кода выглядит следующим образом;

#!/usr/local/bin/perl
my $line_no = 0;my $cancel = 0; my $line = "";
my $curpos = 0; my $whence = 0;

my $log_file = "/var/log/tmp_nagios.log";
#open(LOGFILE, "+< $log_file")or die "Failed to open $log_file, $!";

my $inp_file = "/var/log/sec_input";
my $logbuffer="";

#open(LOGFILE, "+< $log_file")or die "Failed to open $log_file, $!";
my $in;

while(1){
    print "in While (1) Pos: $curpos and Whence:$whence\n";

    open(LOGFILE, "+< $log_file")or die "Failed to open $log_file, $!";
    seek(LOGFILE, $curpos, $whence);
    next if(eof(LOGFILE));

    print "Beginning\n";
    while(<LOGFILE>){
            #chomp($in = <STDIN>);
            #if(defined($in) && $in =~ /^suspend$/i){
            ### Problem here ###
            if(defined(<STDIN>) && <STDIN> =~ /^suspend\n$/i){ ## checking if 'suspend' is entered
                    print "Suspend Mode";
                    do{
                            sleep(5);
                    }while(!(<STDIN> =~ /^resume\n$/i));
                    print "Resume now\n";
                    close(LOGFILE);
                    last;
            }
            else{
                    $line = $_;
                    if($line =~ m/^\[(\d+)\]\sCURRENT\sSERVICE\sSTATE:\s(\w+);(\w+|\_|\d+)+;(CRITICAL|OK);.+$/){
                            $logbuffer = "$1,$2-$3,$4\n";
                            print $logbuffer;
                            open(INPFILE, ">> $inp_file")or die "Failed! to open $inp_file, $!";
                            #print INPFILE $logbuffer;
                            close(INPUTFILE);
                            sleep(5);
                            $curpos = tell(LOGFILE);
                            $whence = 1;
                    }
            }
    }
    print "\nRe openning the file from Pos=$curpos and Whence=$whence\n";
   }
   close(LOGFILE);

вот пример файла журнала (/var/log/tmp_nagios.log);

[1284336000] ТЕКУЩЕЕ СЕРВИСНОЕ СОСТОЯНИЕ: хост1; событие1; КРИТИЧЕСКОЕ; s

[1284336000] ТЕКУЩЕЕ СЕРВИСНОЕ СОСТОЯНИЕ: хост2; событие1; КРИТИЧЕСКОЕ; е

[1284336000] СОСТОЯНИЕ СЕРВИСНОГО ОБСЛУЖИВАНИЯ: host3; event3; CRITICAL; г

[1284336000] ТЕКУЩЕЕ СЕРВИСНОЕ СОСТОЯНИЕ: host4; event4; CRITICAL; J

[1284336000] ТЕКУЩЕЕ СЕРВИСНОЕ СОСТОЯНИЕ: host5; event1; CRITICAL; s

[1284336000] СОВРЕМЕННОЕ СОСТОЯНИЕ ОБСЛУЖИВАНИЯ: host6; event1; CRITICAL; е

[1284336000] СОВРЕМЕННОЕ СОСТОЯНИЕ ОБСЛУЖИВАНИЯ: host7; event7; CRITICAL; s


Простите, ребята! Опечатка

В начале я сказал: «Мой скрипт читает данные из файла журнала с задержкой в ​​5 секунд, то есть sleep (5)»

но на самом деле я забыл упомянуть об этом в своем коде, поэтому раскомментируйте эту строку: #sleep (3); и засыпай (5);

спасибо

Ответы [ 2 ]

1 голос
/ 24 ноября 2010

Если я правильно понял ваш вопрос: проверьте модуль CPAN Term::ReadKey.

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

https://metacpan.org/pod/Term::ReadKey

Вы также можете подойти к этой проблеме немного по-другому - используя сигналы: http://perldoc.perl.org/perlipc.html. Вы можете запустить свою программу в обычном режиме, но перехватывать прерывания (например, CTRL-C)

В качестве альтернативы, вы можете просто использовать CTRL-Z и fg, чтобы заставить ваш скрипт спать и просыпаться.

0 голосов
/ 25 ноября 2010

Другой вариант: POE :: Wheel :: FollowTail для журнала и POE :: Wheel :: ReadLine или Term :: Visual для ввода пользователя,Хотя это может быть немного излишним

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...