【问题标题】:How to make the scp retry till it succeds in case of a failed attempt?如果尝试失败,如何使 scp 重试直到成功?
【发布时间】:2014-04-21 18:08:00
【问题描述】:

我在服务器 B 中编写了一个 perl 脚本,用于每隔一小时从服务器 A 到服务器 B 定期 scp 文件。 问题是有时由于服务器 B 上的一些问题, scp 在特定小时内失败。 我希望 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。任何帮助将不胜感激。

【问题讨论】:

    标签: perl unix scp


    【解决方案1】:

    尝试用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;
    }
    

    【讨论】:

    • $echo_soc=echo $? 行实际上捕获了 scp 的退出状态(如果正确)
    • 假设scpecho 在同一个shell 中运行。但事实并非如此。
    • sleep 1 等待一秒钟。我只是举个例子。程序将重复尝试scp,直到成功。
    • 哦,所以我可以说明如果命令第一次失败,scp 将等待重试的时间(以秒为单位)对吗?如果 scp 也第二次失败,这会起作用吗?我的意思是直到退出状态为零,这个while循环才会继续发生,对吗?
    • 是的,这将重复尝试scp,以 1 秒为间隔,直到成功。如果你想限制重试次数,你也需要一个计数器。
    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2016-02-16
    • 2017-03-12
    • 2020-08-14
    • 2019-07-28
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多