簡體   English   中英

PERL Net::SFTP::Foreign autodie=>0 then 1

[英]PERL Net::SFTP::Foreign autodie=>0 then 1

我正在編寫一個腳本,每天在某些 sftp 服務器上自動檢索一些文件。 問題是這個 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;
      }
}

您可以將連接包裝到 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;
      }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM