PERL Net :: SFTP :: Foreign autodie => 0然后是1

时间:2016-09-16 15:13:40

标签: perl sftp autodie

我正在编写一个脚本,每天在某个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;
      }
}

1 个答案:

答案 0 :(得分: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;
      }
}