4

私のエラーは次のとおりです

/usr/lib/perl5/site_perl/5.8.6/Parallel/ForkManager.pm行463の子プロセスにいる間は、別のプロセスを開始できません。

問題が発生している私のコードの部分は以下のとおりです。私のコードの下には、forkmanagerで失敗するサブルーチンがあります。理由がわかりません。forkmanagerがなくても、問題なく実行できます。

my $pm = new Parallel::ForkManager($MAX_PROCESSES);
for (0..$SCOUNT)
{
my $pid = $pm->start and next;
    my %shash = ();
    %shash =
    (   ID      => "$SREF->[$_]->[0]",
        typeID  => "$SREF->[$_]->[1]",
        extIP   => "$SREF->[$_]->[2]",
        intIP   => "$SREF->[$_]->[3]",
        NAME    => "$SREF->[$_]->[4]",
        buTYPE  => "NULL"
    );
    if ($shash{typeID} =~ /^(4|16|17|25|27|28|42|49|50|51|54|58|60|63|19)$/){$shash{buTYPE} = 'LINUX DEDICATED';}
    if ($shash{typeID} =~ /^(11|14|22|32|34|36|37|46)$/)                    {$shash{buTYPE} = 'LINUX FULL';}
    if ($shash{typeID} =~ /^(44)$/)                                         {$shash{buTYPE} = 'EMAIL MARKETER';}
    if ($shash{typeID} =~ /^(43)$/)                                         {$shash{buTYPE} = 'TYip1';}
    if ($shash{typeID} =~ /^(45)$/)                                         {$shash{buTYPE} = 'DDDOMAINS';}
    if ($shash{typeID} =~ /^(56)$/)                                         {$shash{buTYPE} = 'AT MAIL';}
    if ($shash{typeID} =~ /^(65|66)$/)                                      {$shash{buTYPE} = 'ENT MAIL';}
    if ($shash{typeID} =~ /^(1|3)$/)                                        {$shash{buTYPE} = 'LINUX PROD';}

    if ($shash{buTYPE} eq 'LINUX DEDICATED' || $shash{buTYPE} eq 'LINUX FULL')
    #if ($shash{buTYPE} eq 'LINUX FULL')
    {
        next if (`grep $shash{NAME} $excludes`);
        my $ip;
        my $ipchoice=0;
        print "Doing $shash{NAME}.\n";
        my $testport = testport("$shash{intIP}",'1500');
        if(!$testport)
        {
            $ipchoice=1;
            $testport = testport("$shash{extIP}",'1500');
        }
        unless ($testport)
        {
            log_event("$log/rsync_error.$date_string","Port 1500 closed for $shash{NAME}\n");
            next;
        }
        if ($ipchoice==0)
        {   $ip = $shash{intIP};
        }else{
            $ip = $shash{extIP};
        }
#       send_file("$repo/rsyncd.conf","$shash{intIP}","/etc/rsyncd.conf");
        check_rsync($shash{NAME},$ip);
#       do_backup($shash{NAME},$ip,$shash{buTYPE});
    }
    $pm->finish;
}
$pm->wait_all_children;

ForkManager.pmコーディング。

sub start { my ($s,$identification)=@_;
  die "Cannot start another process while you are in the child process"
    if $s->{in_child};
  while ($s->{max_proc} && ( keys %{ $s->{processes} } ) >= $s->{max_proc}) {
    $s->on_wait;
    $s->wait_one_child(defined $s->{on_wait_period} ? &WNOHANG : undef);
  };
  $s->wait_children;
  if ($s->{max_proc}) {
    my $pid=fork();
    die "Cannot fork: $!" if !defined $pid;
    if ($pid) {
      $s->{processes}->{$pid}=$identification;
      $s->on_start($pid,$identification);
    } else {
      $s->{in_child}=1 if !$pid;
    }
    return $pid;
  } else {
    $s->{processes}->{$$}=$identification;
    $s->on_start($$,$identification);
    return 0; # Simulating the child which returns 0
  }
}
4

1 に答える 1

9

next子プロセスコード内で呼び出しています。それは、の次の反復を実行しようとしますがfor(0..$COUNT)、それは次にfork再試行しますが、これはあなたが望むものではありません。

あなたはおそらく変更したい

    next if (`grep $shash{NAME} $excludes`);

    $pm->finish if (`grep $shash{NAME} $excludes`);
于 2012-09-26T16:09:52.347 に答える