2010-11-24 60 views
0

我寫了一個腳本,它從日誌文件中讀取一些數據,並將數據轉換爲更簡單的形式並將其寫回到另一個文件。讀數以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)';'

感謝

+4

如果你的貼子裏有問題會更好。我在代碼中看到關於暫停檢查事件的評論。儘管如此,代碼有點雜亂無章。現在,我建議你將代碼簡化爲只分析日誌文件的循環,讓它工作,然後_then_添加信號檢查暫停/恢復。 – zanlok 2010-11-24 17:06:29

回答

1

如果我理解正確你的問題:檢查出Term::ReadKey CPAN模塊。

你可以用它來做非阻塞的緩衝讀取。 (如果沒有在緩衝區中,您的腳本不會暫停以等待用戶輸入)

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

你可能也想略有不同解決這個問題 - 使用信號: http://perldoc.perl.org/perlipc.html。您可以讓程序正常運行,但捕獲中斷(例如,CTRL-C

或者,您可以使用CTRL-Zfg使腳本進入睡眠狀態並喚醒。