use strict; use warnings; use Parallel::ForkManager; my @servers = ('a'..'z'); my $timeout = 10; my $user = "foo"; my $file = "/tmp/hello.txt"; my $rpath = "/tmp"; my $fname = "hello.txt"; my $fork_manager = Parallel::ForkManager->new(8); $fork_manager->set_waitpid_blocking_sleep(0); foreach my $server (@servers) { my $pid = $fork_manager->start; if ($pid) { # parent print "$$: child process started, with a key of $server ($pid)\n"; } else { # child eval { local $SIG{ALRM} = sub { alarm 0; die "alarm\n" }; alarm $timeout; my $rc = system("scp -p $file $user\@$server:$rpath/$fname"); }; alarm 0; $fork_manager->finish; } } $fork_manager->wait_all_children();