[Fork] Gestion des childs - Besoin d'aides :)

Gestion des childs - Besoin d'aides :) [Fork] - Perl - Programmation

Marsh Posté le 27-11-2002 à 22:39:40    

j ai code un ti demon qui fais des requetes snmp sur une liste d'hosts
 
marche tres bien mais le truc c k il ne traite qu'un host a la fois
j aurai voulu l ameliorer en faisant des fork pour lance plusieurs requete en parallele.
 
en faite g ma liste d host ds un array
 
un truc du style:
 
while () {
    foreach (@liste) {
       if ($pid = fork) {
       wait;
       sleep 60;
       }
       defined($pid) || die "fork impossible\n";
       ..
       le fiston fais ses requetes snmp..
       ..
       exit;
       }
    }
 
maintenant vu que ca doit boucler ttes les 60s, comment je peut faire pour eviter par exemple que 2 requetes se fasse sur le meme host ?
 
un autre truc aussi
la actuellement en fait je vais creer autant de process fils que d hosts ds la liste.
comment faire pour par exemple les faire de 5 en 5
style il prend les 5 premiers les tests, ensuites les 5 suivant...etc
 
merci d'avance pour votre aide ;)


Message édité par djtoz le 30-11-2002 à 16:37:23
Reply

Marsh Posté le 27-11-2002 à 22:39:40   

Reply

Marsh Posté le 30-11-2002 à 16:31:39    

bon j'ai avance :)
j'explique plus en detail ou j'en suis et ce que je voudrai bien faire :p
 
donc actuellement je gere le nombre de childs simultanes que je lance pour faire les requetes snmp
 
voila ma methode:
 
les hosts a interoger sont ds le tableau @hosts.
$$conf{childs} contient le nbr de childs a lance en parallele.
$$conf{interval} contient le nbr de seconde a attendre avant de relance un check de tous les hosts.
 
my $i = 0;
while () {
    foreach $ligne (0..$#{@$hosts}) {
        $i++;
        if ($i == $$conf{childs}) {
            map {waitpid($_, 0)} (@pid);
            undef @pid;
            $i = 1;
            }
 
         ### le papa ###
   
        if ($pid = fork) {
            push @pid, $pid;
            }
 
        ### le fiston ###
 
        else {
            defined($pid) || die "fork a foire: $!\n";
            ...
            requetes snmp...
            ...
            exit;
            }
        }
    map {waitpid($_, 0)} (@pid);
    sleep "$$conf{interval}";
    }
 
bon la actuellement ca fonctionne tres bien.
seulement c pas tres optimise.
 
c'est a dire qu'au depart je prend $$conf{childs} hosts parmis ma liste d'hosts, puis j'attends qu'il meurt tous pour a nouveau en prendre $$conf{childs} suivant ds la liste.
ainsi de suite...
 
ce que je voudrais faire c'est que par exemple si je fixe $$conf{childs} a 5 childs, j'en prends 5 au debut mais des que y'en a 1 qui est termine, au lieu d'attendre que tous meurt pour continuer ds la liste d'hosts, je voudrai en demarre 1 nouveau.
de sorte que j'ai en permanence 5 childs lance.
 
je sais pas si je suis assez clair :)
mais si vous voulez plus d'explication, n'hesitez pas.
 
merci d'avance pour votre aide


Message édité par djtoz le 30-11-2002 à 16:35:57
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed