2016-09-16 32 views
2

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

私はオープニング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; 
     } 
} 

答えて

1

あなたがこれは動作するはずのeval声明にあなたの接続をラップし、1 にautodieを設定することができます。

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 ([email protected]) { 
     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; 
     } 
} 
+0

それは 'evalのを使用するほうが安全です{...; 1} or ... '$ @'が特定の状況下で壊れる可能性があるためです。または、[Try :: Tiny](http://p3rl.org/Try::Tiny)を使用してください。 – choroba

+0

それはうまく動作します!どうもありがとう。 eval {...}の最後にセミコロンを追加するだけでした。 –

関連する問題