#!/usr/bin/perl
use strict;
use warnings;
use Net::OpenSSH::Parallel 0.12;
use Net::OpenSSH::Parallel::Constants qw(OSSH_ON_ERROR_IGNORE);
@ARGV == 3 or die <<EOU;
Usage:
$0 host src_dir dst_dir
EOU
my ($host, $src, $dst) = @ARGV;
opendir my $dh, $src or die "unable to open $src";
my @ls = grep !/^\.{1,2}$/, readdir $dh;
close $dh;
my %now;
sub on_error {
my ($pssh, $label, $error) = @_;
warn "transfer of $now{$label} by $label failed\n";
OSSH_ON_ERROR_IGNORE;
}
sub fetch_next {
my ($pssh, $label) = @_;
if (@ls) {
my $file = shift @ls;
$now{$label} = $file;
warn "$label is copying $file\n";
$pssh->push($label, rsync_put => "$src/$file", "$dst/$file");
$pssh->push($label, sub => \&fetch_next);
}
}
my $p = Net::OpenSSH::Parallel->new(on_error => \&on_error);
$p->add_host("worker$_", $host) for 1..5;
$p->all(sub => \&fetch_next);
$p->run;
Requires
Net::OpenSSH::Parallel 0.12 I have just uploaded to CPAN.