简体   繁体   中英

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

I'm writing a script that retrieves some files automatically once a day on some sftp server. The problem is this sftp server is not very reliable and sometimes the client have to retry a couple of times until opening the session successfully. I choose Net::SFTP::Foreign for different reasons (especially because it uses the native ssh command from the system).

I wrote a loop in order to retry the opening sftp session 3 times before giving up.

My problem : I want to keep the autodie=1 because it automatically handles the non-recoverable errors for all methods used later in the code. But the autodie=1 prevents me to trap any error during the session opening (Net::SFTP::Foreign->new) and therefore the retries part is useless.

Here is the part of the code I wrote, the autodie is set to 0 in order to make work the retries part (but I want autodie=1). Is it possible to open the sftp connection with autodie=>0 so that the retries part actually works, and then change this value with autodie=>1 in order to have the auto handling of non-recoverable errors ?

Any help would be much appreciated :)

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;
      }
}

You can wrap your connection into eval statement and set autodie to 1. This should work:

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;
      }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM