1

別のサーバーからいくつかのログファイル(txt形式)をフェッチし、Perlスクリプトを使用してそれらを解析しようとしています。ログが正しくフェッチされた後、ログディレクトリのアクセス許可を777に設定しました。

この後、Perlスクリプトを使用して、解析用にログファイルを1つずつ開こうとします。さて、奇妙なことと起こる問題は、私のスクリプトがファイルを開くことができる場合とできない場合があります。簡単に言うと、ログファイルを開いて解析できない場合があります。

また、私はこのperlスクリプトをcronしました。以前はどちらの場合も正常に実行されていましたが、手動ではなくcronを介して実行すると、ファイルを開くことが失敗する可能性が高くなります。問題がどこにあるのかわかりません。

これが私がファイルを開くために使用するコードです、

$inputDir = "/path/to/dir";
@inputFiles = <$inputDir/*>;

# inputFiles array is list of files in the log directory
foreach my $logFile(@inputFiles)
{
    # just to ensure file name is text
    $logFile = $logFile."";

    # process file only if filename contains "NOK"
    if(index($logFile,"NOK") > -1)
    {
        # opens the file
        open($ifile, '<', $logFile) or die "Error: Unable to open file for processing.";

        # file parsing takes place
    }
}

close($ifile);

このコードは正常に実行され、その一部を変更していないことを繰り返します。ただし、ログファイルを開くことができない場合があるため、毎回必ず実行されるわけではありません。何か案は?

4

3 に答える 3

5

文字列にエラーメッセージ$!とファイル名$logFileを含めて、開くことが失敗した理由とファイルを確認する必要があります。die

open($ifile, '<', $logFile) or die "Error: Unable to open $logFile: $!";

また、この行:

$logFile = $logFile."";

...かなり冗長です。変換が必要な場合は、perlが処理します。

于 2013-01-16T07:18:28.863 に答える
0

例として、これはあなたのコードがどのように見えるべきかです。このバージョンを試してみてください

use strict;
use warnings;

my $inputDir = '/path/to/dir';
my @inputFiles = <$inputDir/*>;

foreach my $logFile (grep /NOK/, @inputFiles) {
  open my $ifile, '<', $logFile or die qq(Unable to open "$logFile": $!);
  # Process data from <$ifile>;
}
于 2013-01-16T16:57:23.890 に答える
-1

プログラムに開いているファイルが多すぎるため、一部のファイルを開くことができない場合があります。プログラムはですべてのファイルを開き$inputDir、ループでそれらを処理します。その後、最後に開いたファイルを閉じます。

編集:TLPのコメントを読んで読んだ後perldoc -f closeperldoc -f openTLPが正しく、のファイルハンドルが$ifile後続のによって閉じられていることがわかりopen($ifile,'<',$logFile)ます。ただし、トピック作成者によって表示されないファイル解析コード$ifileがファイルハンドルへの別の参照を作成する場合、開いたままになります。

呼び出しをブロックに移動するとcloseif問題が解決するはずです。

$inputDir = "/path/to/dir";
@inputFiles = <$inputDir/*>;

# inputFiles array is list of files in the log directory
foreach my $logFile(@inputFiles)
{

    # process file only if filename contains "NOK"
    if(index($logFile,"NOK") > -1)
    {
        # opens the file
        # added my to $ifile to keep local to this scope
        open(my $ifile, '<', $logFile) or die "Error: Unable to open file for processing.";

        # file parsing takes place

        # close current file
        close($ifile);
    }
}
于 2013-01-16T08:53:50.220 に答える