2010-08-18 11 views
2

Alors, quand je lance ce code, il semble que le système soit bombardé par le système, les gars peuvent-ils m'aider? Tout ce que je veux faire est de démarrer un thread pour chacun des domaines et des environnements appWatch.Perl: Pourquoi cela crée-t-il des milliers de processus fils?

#!/usr/bin/perl 
# 
# 
#  Starts the mass processes to watch each directory & enviroment. 
# 
# 
# 
################################################################################### 
use strict; 
use warnings; 
use POSIX 'setsid'; 
setsid(); 
my @domains = (qw(austin batman luke heman drevil joker skeltor drevil goodguy badguy)); 
my @envs = (qw(qa dev)); 
     foreach my $env (@envs){ 
       foreach my $guy (@domains){ 
         unless(my $pid = fork()){ 
           system("echo $env.$guy"); 
           system("sleep 10 "); 
           #system("./appWatch -d $guy -e $env"); 
           open PID, ">>pid.lock"; 
           print PID $$ . "\n"; 
           print "$$ is Parent, $pid is child"; 
       } 
     } 
} 
       wait(); 

Répondre

3

Votre code ne doit créer trois enfants . Si vous voyez un groupe d'enfants en cours de création, alors vous exécutez un code différent (ou le coupable est appWatch pas votre code). Sur une note légèrement sans rapport, il y a deux choses que vous devriez probablement faire différemment:

  1. fork a trois valeurs de retour possibles, pas deux
  2. vous devez récolter vos enfants ou configurer le système pour les récolter pour vous
  3. vous devez utiliser exec au lieu de système si vous ne voulez pas revenir au code
  4. vous devez utiliser le multiple version argument system et exec au lieu de la version argument si vous ne voulez pas la coquille faire des choses avec les arguments.

Voici ma version de votre code:

$SIG{CHLD} = "IGNORE"; #auto-reap the children 
my @domains = qw(domains); 
my @envs = qw(enviromentA enviromentB); 
for my $env (@envs){ 
     for my $guy (@domains){ 
       die "could not fork: $!" unless defined(my $pid = fork); 
       next if $pid; 
       exec "./appWatch", "-d", $guy, "-e", $env; 
       die "exec must have failed"; 
     } 
} 

Vous version mise à jour du code montre ce qui est arrivé. Votre enfant ne quitte pas. Voici comment j'écrirais votre code:

#!/usr/bin/perl 
# Starts the mass processes to watch each directory & enviroment. 

use strict; 
use warnings; 
use POSIX 'setsid'; 
setsid(); 

my @domains = qw(
    austin batman luke heman 
    drevil joker skeltor drevil 
    goodguy badguy 
); 
my @envs = qw(qa dev); 

my @pids; 
for my $env (@envs){ 
    for my $guy (@domains){ 
     die "could not fork: $!" unless defined(my $pid = fork); 
     if ($pid) { 
      push @pids, $pid; 
      next; 
     } 
     print "$env.$guy\n"; 
     sleep 10; #FIXME: I don't know if you really need this 
     #exec will replace the child process with appWatch 
     exec "./appWatch", "-d", $guy, "-e", $env; 
     die "exec failed for some reason"; 
    } 
} 
for my $pid (@pids) { 
    waitpid $pid, 0; 
} 
+0

Ok Cool une fois que je reçois le système de sauvegarde, je vais poster le mauvais code mais le vôtre fonctionne très bien. Merci! Ma deuxième question, si vous le pouvez, comment puis-je faire en sorte que si ce script est tué, il tue tous ses enfants? –

+0

@Nerdatastic Au sommet de ma tête, vous pouvez vous souvenir de tous les IP enfants dans un tableau et utiliser un bloc 'END' pour les" tuer ":' END {kill 15, @pids} '. –

+0

Je viens de mettre à jour le code avec celui qui a planté le système que je suis en utilisant votre solution modifiée pour le moment. –

1

Avec

$ cat appWatch 
#! /usr/bin/perl -l 
print "[", join("][" => @ARGV), "]";

en cours d'exécution sur

$ uname -a 
Linux mybox 2.6.32-24-generiC#39-Ubuntu SMP Wed Jul 28 05:14:15 UTC 2010 x86_64 GNU/Linux

Je reçois pas de bombe fork, juste un produit cartésien unexciting:

$ ./prog.pl 
[-d][domains][-e][enviromentA] 
[-d][domains][-e][enviromentB]
+0

Si j'obtiens le système que je viens de bifurquer je vais vous montrer le dernier code. C'est essentiellement juste cela. Il ne fonctionne normalement pas, mais pour une raison quelconque, il commence des milliers de processus –