[英]PERL Net::SFTP::Foreign autodie=>0 then 1
我正在編寫一個腳本,每天在某些 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;
}
}
您可以將連接包裝到 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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.