2016-09-16 128 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),因此retries部分是無用的。

下面是我寫的代碼的一部分,自動設置爲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語句,並設置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 ([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}或...',因爲'$ @'在某些情況下可能會被破壞。或者使用[Try :: Tiny](http://p3rl.org/Try::Tiny)。 – choroba

+0

這工作正常!非常感謝。 只需在eval {...}的末尾添加分號; –

相關問題