gpt4 book ai didi

PERL Net::SFTP::Foreign autodie=>0 然后 1

转载 作者:行者123 更新时间:2023-12-01 01:15:02 27 4
gpt4 key购买 nike

我正在编写一个脚本,每天在某个 sftp 服务器上自动检索一些文件。问题是这个 sftp 服务器不是很可靠,有时客户端必须重试几次才能成功打开 session 。我出于不同的原因选择 Net::SFTP::Foreign(特别是因为它使用系统中的 native ssh 命令)。

我写了一个循环,以便在放弃之前重试打开的 sftp session 3 次。

我的问题:我想保留 autodie=1,因为它会自动处理代码后面使用的所有方法的不可恢复错误。但是 autodie=1 阻止我在 session 打开期间捕获任何错误 (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;
}
}

关于PERL Net::SFTP::Foreign autodie=>0 然后 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39534880/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com