use strict; use warnings; use MCE::Loop; use MCE::Shared; my @servers = ('a'..'z'); my $timeout = 10; my $user = "foo"; my $file = "/tmp/hello.txt"; my $rpath = "/tmp"; my $fname = "hello.txt"; tie my %result, 'MCE::Shared'; MCE::Loop->init( chunk_size => 1, max_workers => 8, ); MCE::Loop->run( sub { my $server = $_; MCE->say("child process running, with a key of $server ($$)"); eval { local $SIG{ALRM} = sub { alarm 0; die "alarm\n" }; alarm $timeout; $result{$server} = system("scp -p $file $user\@$server:$rpath/$fname"); }; alarm 0; }, @servers ); MCE::Loop->finish; for my $server ( sort keys %result ) { my ($status, $signum); $status = $result{$server}; $signum = $status & 127; # extract signal number $status = $status >> 8; # becomes exit status print "$server: exit_status $status, signal_num $signum\n"; }