我正在寫一個腳本,每天在某些sftp服務器上自動檢索一些文件。 問題是這個sftp服務器不是很可靠,有時客戶端必須重試幾次,直到成功打開會話。 我選擇Net :: SFTP :: Foreign出於不同的原因(特別是因爲它使用系統的本地ssh命令)。PERL Net :: SFTP :: Foreign autodie => 0 then 1
我寫了一個循環,以便在放棄之前重試開始sftp會話3次。
我的問題: 我想保留autodie = 1,因爲它會自動處理代碼中稍後使用的所有方法的不可恢復錯誤。 但autodie = 1阻止我在會話打開期間捕獲任何錯誤(Net :: SFTP :: Foreign-> new),因此retries部分是無用的。
下面是我寫的代碼的一部分,自動設置爲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 {...; 1}或...',因爲'$ @'在某些情況下可能會被破壞。或者使用[Try :: Tiny](http://p3rl.org/Try::Tiny)。 – choroba
這工作正常!非常感謝。 只需在eval {...}的末尾添加分號; –