perl - 如果尝试失败,如何使 scp 重试直到成功?

标签 perl unix scp

我在服务器 B 中编写了一个 perl 脚本,用于每隔一小时从服务器 A 到服务器 B 定期 scp 一个文件。 问题是有时 scp 由于服务器 B 上的某些问题而在特定时间失败。 我希望 scp 在发生这种情况时不断重试,直到成功为止。

脚本是:

$soc_scp=`scp -r user\@some_ip:\/home\/hbase\/hourly\/$datehr\.tar\.gz \/home\/hbase\/hourly\/$datehr\.tar\.gz`;


$echo_soc=`echo $?`;

if($echo_soc != 0)
{
$soc_scp=`scp -r user\@some_ip\:\/home\/hbase\/hourly\/$datehr\.tar\.gz \/home\/hbase\/hourly\/$datehr\.tar\.gz`;
}

出于安全原因,我没有指定 ip。非常感谢任何帮助。

最佳答案

尝试使用 system() 调用 scp 而不是反引号。这会捕获 scp 的退出状态而不是其输出。然后您可以检查它并在它不为零时重试。

sleep 1 while system "scp -r user\@some_ip:/home/hbase/hourly/$datehr.tar.gz /home/hbase/hourly/$datehr.tar.gz";

这将以 1 秒的间隔永远尝试 scp 直到成功。
将尝试次数限制为 10 次:

my $tries = 0;
while (system "scp -r user\@some_ip:/home/hbase/hourly/$datehr.tar.gz /home/hbase/hourly/$datehr.tar.gz") {
    last if $tries++ > 10;
    sleep 1;
}

关于perl - 如果尝试失败,如何使 scp 重试直到成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22439073/

相关文章:

java - 如何调用 BSTR* 的 OleAutomation 对象方法?

mysql - 从 SQlite 中选择使用 EPOCH 时间的过去 24 小时

c++ - 处理客户端连接的最有效方式(套接字编程)

mercurial - scp 一个 mercurial 存储库

linux - 如何将文件从AWS服务器传输到AWS服务器位于Bastion服务器后面的本地计算机

c# - 如何在 C# 程序中嵌入 perl 解释器

regex - 在 Ruby 中是否有与 String.scan 等效的 Perl?

perl 获取所需参数的列表

unix - 如何删除当前目录中与给定模式不匹配的某些文件?

linux - 如何在通过中间服务器连接的本地服务器和远程服务器之间传输数据?