我寫了一個腳本,它從日誌文件中讀取一些數據,並將數據轉換爲更簡單的形式並將其寫回到另一個文件。讀數以5秒的延遲即睡眠(5)逐行進行。PERL:一起讀取日誌文件和cmd行輸入
同時,在命令行中,如果用戶輸入'suspend'(通過STDIN),程序會繼續進入睡眠狀態,除非'resume'沒有輸入,然後讀取下一行。
因爲,在循環中的每一次迭代中,我都檢查STDIN用戶是否輸入了「掛起」。
如果沒有,則從文件中讀取下一行。但是當我的程序運行時,我必須至少敲一個回車鍵,否則它不會從輸入日誌文件中選擇下一行,儘管我放了一個if語句來檢查STDIN是否未定義。
我不是Perl專家,這是我第一次在PERL編寫代碼。 INFACT我從來沒有做過此文件之前分析的事情:' - (
我的代碼執行是這樣的;
#!/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; CRITICAL; S
[1284336000]當前的服務狀態:主機2;事件1; CRITICAL;˚F
[1284336000] CURR ENT服務狀態:host3; event3; CRITICAL; g
[1284336000]當前服務狀態:host4; event4; CRITICAL; j
[1284336000] CURRENT SERVICE STATE:host5; event1; CRITICAL; s
[1284336000] CURRENT SERVICE STATE:host6; event1; CRITICAL; f
[1284336000]當前服務狀態:host7; event7; CRITICAL; s
對不起!錯字錯
在開始的時候我說,「我的劇本與5秒的延遲讀取從日誌文件中的數據,即睡眠(5)」
但實際上我忘記提及它在我的代碼,因此,取消註釋此行:#sleep(3);並做'睡眠(5)';'
感謝
如果你的貼子裏有問題會更好。我在代碼中看到關於暫停檢查事件的評論。儘管如此,代碼有點雜亂無章。現在,我建議你將代碼簡化爲只分析日誌文件的循環,讓它工作,然後_then_添加信號檢查暫停/恢復。 – zanlok 2010-11-24 17:06:29