1

(もちろん、SO を介して) 不正な$ftp = Net::FTP->new()呼び出しのエラーが発生し$@、その後のエラーは によって取得できることを理解した後$ftp->message()、小さな問題に直面しています。

私のコードは基本的に次のとおりです。

while (1) {
    # Wait for cycle start, then get file list into @filelist.

    foreach $file (@filelist) {
        my $ftp = Net::FTP->new ($host);
        if (! $ftp) {
            logError ("Could not connect to host [$host]: $@");
            return;
        }
        # More FTP stuff below with $ftp->message() error checking.
        $ftp->quit();
    }
}

余談ですが、おそらく 1 つの FTP セッションでこれを実行できることはわかっていますが、現時点では別のセッションに残しておくのには十分な理由があります。

現在、これはループで呼び出され、ファイルごとに 1 回、すべて同じホストに送られますが、ほとんどのサイクルで最初の試行でわずかに異なる動作が得られます。スクリプトは長時間実行されるスクリプトであり、各サイクルは 1 時間半に開始されるため、最初のサイクル以外のサイクルでも発生するため、プログラムの開始後の最初の試行では問題になりません。

アクセスしようとしているマシンが開発ネットワークで利用できないという理由だけで、これらの接続が失敗するはずであることがわかりました。

問題は、ログ ファイルに次のようなエラーが出力されることです。

E 2012-02-05 18:00:13 Could not connect to host [example.com]: 
E 2012-02-05 18:00:13 Could not connect to host [example.com]:
    Net::FTP: connect: Connection refused
E 2012-02-05 18:00:14 Could not connect to host [example.com]:
    Net::FTP: connect: Connection refused

ご覧のとおり$@、サイクルの最初のファイルでは変数が設定されていないようです。最新のサイクルに 3 行すべてにエラー メッセージが含まれていることに気付いたので、この質問を少し編集しました。次のコマンドでログに戻ります。

grep refused logfile | awk '{print substr($3,1,5)}' | uniq -c

日付とカウントを取得するには、次の統計を調べます。

  3 11:00
  3 11:30
  3 12:00
  3 12:30
  3 13:00
  3 13:30
  2 14:00
  3 14:30
  3 15:00
  3 15:30
  3 16:00
  2 16:30
  2 17:00
  2 17:30
  2 18:00
  2 18:30
  2 19:00
  3 19:30

一部のエラー メッセージの数は正しいが、すべてではないことを示しています。

これがなぜそうなのか、誰かが知っているかどうか疑問に思っています。

4

2 に答える 2

4

http://cpansearch.perl.org/src/GBARR/libnet-1.22_01/Changes をアップグレードしてみてください

libnet 1.22_01 -- Mon May 31 09:40:25 CDT 2010
*Set $@ when ->new returns undef

libnetの前のバージョンを使用している場合、コードで始まらない応答に関して1.22_01、関数に小さなバグがありました。new

たとえば、FTP.pm 2.77which is fromlibnet 1.21には次のスニペットがあります。

unless ($ftp->response() == CMD_OK) {
    $ftp->close();
    $@ = $ftp->message;
    undef $ftp;
}

FTP.pm 2.77_2fromを使用するlibnet 1.22_01と、これは次のように変更されます。

unless ($ftp->response() == CMD_OK) {
    $ftp->close();
    # keep @$ if no message. Happens, when response did not start with a code.
    $@ = $ftp->message || $@;
    undef $ftp;
}
于 2012-02-05T13:21:49.743 に答える