Parallel :: ForkManager дает - STDIN дочернего процесса не является реальной системной ошибкой - PullRequest
1 голос
/ 06 августа 2020

У меня есть сценарий, который выполняет 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(..)?

...