2010-11-24 3 views
0

ログファイルからデータを読み込んで、より簡単な形式に変換して別のファイルに書き戻すスクリプトを作成しました。 5秒の遅延、すなわちスリープ(5)によりライン毎に読みが行われる。PERL:ログファイルとcmdライン入力を一緒に読む

一方、ユーザーが 'suspend'(STDINを通じて)を入力すると、プログラムは 'resume'が入力されない限りスリープ状態になり、次の行を読み込みます。

ループ内のすべての反復で、私はSTDINをチェックしています。なぜなら、ユーザーが「中断」を入力したかどうかをチェックするからです。

もしそうでなければ、ファイルから次の行を読んでください。私のプログラムが実行されるときには、少なくともSTDINが定義されていないかどうかをチェックするためにif文を置くにもかかわらず、入力ログファイルから次の行をピックしません。

私は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] CURRENTサービス状態:HOST1; EVENT1、CRITICAL; S

[1284336000] CURRENTサービス状態:HOST2; EVENT1、CRITICAL;

F [1284336000] CURR ENTサービス状態:host3; event3; CRITICAL; g

[1284336000]現在のサービス状態:host4; event4; CRITICAL; j

[1284336000]現在のサービス状態:host5; event1; CRITICAL; s

[1284336000]現在のサービス状態:host6; event1; CRITICAL; f

[1284336000]現在のサービス状態:host7; event7; CRITICAL; s


ごめんなさい!私は「私のスクリプトは、睡眠、つまり5秒の遅れでログファイルからデータを読み込んでいる(5)」と言っ初めのタイプミスミス

が、実際に私は、それゆえ、私のコードでそれを言及するのを忘れこの行のコメントを外します。#sleep(3);そして、「眠る(5)」;

おかげで私が正しくあなたの質問を理解している場合は

+4

あなたの投稿に質問がある方が良いでしょう。サスペンドチェックに関するコードのコメントが表示されます。しかし、コードはコメントアウトされたセクションでちょっと混乱しています。今のところ、コードを単純化して、ログファイルを解析し、その動作を取得し、_then_ addをシグナルの一時停止/再開のチェックに追加することをお勧めします。 – zanlok

答えて

1

Term::ReadKey CPANモジュールをチェックしてください。

これを使用して、非ブロッキングバッファの読み取りを行うことができます。 (バッファには何も存在しない場合、スクリプトがユーザーの入力を一時停止しません)

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

また少し異なり、この問題にアプローチするようなことがあり - 信号を使用して: http://perldoc.perl.org/perlipc.html。あなたはあなたのプログラムを正常に実行させることができますが、割り込みを捕捉します。CTRL-C

また、CTRL-Zfgを使用して、スクリプトをスリープ状態にして起床させることもできます。

関連する問題