3

いくつかの sftp サーバーで 1 日に 1 回、いくつかのファイルを自動的に取得するスクリプトを作成しています。問題は、この sftp サーバーの信頼性が低く、クライアントがセッションを開くまでに数回再試行する必要がある場合があることです。私はさまざまな理由で Net::SFTP::Foreign を選択します (特に、システムからネイティブの ssh コマンドを使用するため)。

あきらめる前に、最初の sftp セッションを 3 回再試行するためにループを作成しました。

私の問題: autodie=1 を維持したいのは、コードの後半で使用されるすべてのメソッドの回復不能なエラーを自動的に処理するためです。しかし、autodie=1 は、セッションの開始 (Net::SFTP::Foreign->new) 中のエラーをトラップできないため、再試行部分は役に立ちません。

これが私が書いたコードの一部です。再試行部分を機能させるために autodie は 0 に設定されています (ただし、autodie=1 が必要です)。再試行部分が実際に機能するように autodie=>0 で sftp 接続を開き、この値を autodie=>1 で変更して、回復不可能なエラーを自動処理することは可能ですか?

どんな助けでも大歓迎です:)

use Net::SFTP::Foreign;

print "Opening SFTP session...\n";
my $j = 1;
my $sftp_max_retry = 5;
while (1) {
      $sftp = do {
        local $SIG{TERM} = 'IGNORE';  # used to avoid the message "Killed by signal 15".
        Net::SFTP::Foreign->new(
                     host      => "some_host_unavailable",
                     port      => 22,
                     user      => "some_user",
                     password  => "some_pwd",
                     autodie   => 0,
                     timeout   => 10,
                     autoflush => 1,
                 );
      };

      if ($sftp->error) {
         if ($j > $sftp_max_retry) {
            print "Opening SFTP failed, maximum retry reached !\n";
            exit 2;
         }
         print "Opening SFTP session (retry $j/$sftp_max_retry)...\n";
         sleep $sftp_retry_loop;
         $j++;
      }else{
         print "\nConnection successful\n";
         last;
      }
}
4

1 に答える 1

1

接続を eval ステートメントにラップし、autodie を 1 に設定できます。これは機能するはずです。

use Net::SFTP::Foreign;

print "Opening SFTP session...\n";
my $j = 1;
my $sftp_max_retry = 5;
my $sftp;
while (1) {
    eval {
      $sftp = do {
        local $SIG{TERM} = 'IGNORE';  # used to avoid the message "Killed by signal 15".
        Net::SFTP::Foreign->new(
                     host      => "some_host_unavailable",
                     port      => 22,
                     user      => "some_user",
                     password  => "some_pwd",
                     autodie   => 1,
                     timeout   => 10,
                     autoflush => 1,
                 );
      };
    }

      if ($@) {
         if ($j > $sftp_max_retry) {
            print "Opening SFTP failed, maximum retry reached !\n";
            exit 2;
         }
         print "Opening SFTP session (retry $j/$sftp_max_retry)...\n";
         sleep $sftp_retry_loop;
         $j++;
      }else{
         print "\nConnection successful\n";
         last;
      }
}
于 2016-09-16T15:33:19.100 に答える