PERL Net::SFTP::Foreign autodie=>0 затем 1

Я пишу скрипт, который автоматически извлекает некоторые файлы один раз в день на каком-либо сервере sftp. Проблема в том, что этот sftp-сервер не очень надежен, и иногда клиенту приходится повторять попытку несколько раз, пока сеанс не будет успешно открыт. Я выбираю Net::SFTP::Foreign по разным причинам (особенно потому, что он использует собственную команду ssh из системы).

Я написал цикл, чтобы повторить 3-й сеанс открытия sftp перед тем, как сдаться.

Моя проблема: я хочу сохранить autodie=1, потому что он автоматически обрабатывает невосстановимые ошибки для всех методов, использованных позже в коде. Но autodie=1 не позволяет мне перехватывать любые ошибки во время открытия сеанса (Net::SFTP::Foreign->new), и поэтому часть повторных попыток бесполезна.

Вот часть кода, которую я написал, autodie установлен в 0, чтобы заставить работать повторные попытки (но я хочу autodie=1). Можно ли открыть соединение sftp с autodie=>0, чтобы часть повторов действительно работала, а затем изменить это значение на 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 ($@) {
         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;
      }
}
Другие вопросы по тегам