У меня есть сценарий, который выполняет s sh нумерацию серверов (@hosts
), хранящихся в массиве, и выполняет определенные команды на этих хостах.
...
use Net::OpenSSH;
use Parallel::ForkManager;
#these hosts are the IP addresses
my @hosts = ("host1", "host2", "host3", "host4", "host5");
my $ssh;
my $command = "perl -e "print \"Hello..\"";
my $pm = Parallel::ForkManager->new(5);
LOOP:
foreach my $n (@hosts) {
my $pid = $pm->start and next LOOP;
#doing ssh to the host and running the command
#lets say here I am executing simple Perl command
$ssh = Connect($n, "user", "passwd");
$ssh->capture($command);
$pm->finish;
}
$pm->wait_all_children;
undef $ssh;
sub Connect {
my ( $host, $user, $passwd ) = @_;
my $ssh = Net::OpenSSH->new($host, user=>$user, password=>$passwd);
$ssh->error and die "Couldn't establish SSH connection: " . $ssh->error;
return $ssh;
}
...
Когда я выполняю этот сценарий, я Я получаю ошибку ниже, которая для меня как кошмар.
child process STDIN is not a real system file handle at (eval 2) line 145
Я не знаю, почему возникает эта ошибка. Может ли кто-нибудь помочь мне решить эту проблему.
Мне что-то не хватает в $pm->finish
или мне нужно добавить $pm->run_on_finish(..)
?