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

use*_*403 3 unix perl scp

我有一个在服务器 B 中编写的 perl 脚本,每隔一小时就从服务器 A 到服务器 B 定期发送一个文件。每当发生这种情况时,都会重试直到成功。

脚本是:

$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`;
}
Run Code Online (Sandbox Code Playgroud)

出于安全原因,我没有指定 ip。任何帮助将不胜感激。

SzG*_*SzG 6

而不是反引号,请尝试scp使用system(). 这会捕获scp的退出状态而不是其输出。然后你可以检查它并重试它是否非零。

sleep 1 while system "scp -r user\@some_ip:/home/hbase/hourly/$datehr.tar.gz /home/hbase/hourly/$datehr.tar.gz";
Run Code Online (Sandbox Code Playgroud)

这将以scp1 秒的间隔永远尝试直到成功。
要将尝试次数限制为 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;
}
Run Code Online (Sandbox Code Playgroud)