【问题标题】:PERL Net::SFTP::Foreign autodie=>0 then 1PERL Net::SFTP::Foreign autodie=>0 然后 1
【发布时间】:2016-09-16 15:13:39
【问题描述】:

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

【问题讨论】:

    标签: perl sftp autodie


    【解决方案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;
          }
    }
    

    【讨论】:

    • 使用eval { ... ; 1 } or ... 更安全,因为$@ 在某些情况下可能会被破坏。或使用Try::Tiny
    • 效果很好!非常感谢。只需要在 eval { ... }; 的末尾添加一个分号;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多