Я написал скрипт, который считывает некоторые данные из файла журнала и преобразовывает данные в более простую форму и записывает их обратно в другой файл. чтение производится построчно с задержкой в 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);
спасибо