Rob,

   Thanks for the help.  I did what you suggested and cleaned up the code.  
But I am getting some strange errors:

Use of uninitialized value in numeric gt (>) at ./script.pl line #.

        foreach $hostId ( @hostIds ) {
                
            my $pid = undef;
            
            $pid = fork if $CHILD_PIDS < $MAX_CHILDREN;

            if( $pid > 0 ) {
                
                $CHILD_PIDS++;     #Add the children up until we hit the max
                
            }elsif (defined $pid) {

           #the rest is just like you suggested.



the message if for the line that says:

f( $pid > 0 ) {

Not too sure what to make of it??

Thansk for the help 

CHad


On Thursday 27 March 2003 11:59 am, Rob Dixon wrote:
> Hi Chad.
>
> Chad Kellerman wrote:
> > Hello,
> >
> >    Got a little issue.  Tyring ot under stand how things work but just
> > not getting it.  I am forking each element of the array .  I have a
> > maximum child count of 8.  Which works.  What I was wondering is if I get
> > into the if statement in the until loop.  How do I exit the pid clean up
> > and go on to the next element in the array with out leaving any pids
> > around?
> >
> > FORK:
> >         {
> >
> >     HOSTID2: foreach $hostId ( @hostIds ) {
> >
> > #next if $CHILD_PIDS > $MAX_CHILDREN;
> > redo HOSTID2 if $CHILD_PIDS >= $MAX_CHILDREN;
> >
> >   if( my $pid = fork ) {
> >     $CHILD_PIDS++;     #Add the children up until we hit the max
> >                     next;
> > }elsif (defined $pid) {
> >                     my $failures = 0;
> >
> >             #grab quota for each user and insert into the database
> >             until ( (BACKUP->QuotaIt( $hostId, $mysqluser, $mysqlpasswd )
> > or ( $failures == $maxtries ) ) ) {
> >                 $failures++;
> >                 if ( $failures == $maxtries ) {
> >                             #BLA BLA code
> >
> >     #clean up the pid and exit
> >                             exit 0;
> >                             waitpid(-1, &WNOHANG);
> >
> >             #go to the next hostid
> >             next HOSTID2;
> >
> >         } #if statememt
> >
> >             } #until statement
> >
> > #rest of code.
> >
> > Thanks for the help,
>
> You'd do yourself a favour if you laid out your code better with
> blocks indented neatly. It's very hard to see the loop structure
> as it is.
>
> You seem to be getting confused over which process your code is
> executing in. You're doing a waitpid from your child processes,
> for instance, and looping on the host ID in all the processes.
>
> Take a look at the following. It almost certainly won't work as it
> is, because I'm not sure of the sense of some of your tests, but it's
> written without using loop labels, which are often a sign of something
> going wrong. It's rarely necessary to label your loops unless you're
> doing something quite tricky.
>
> Let us know if this helps.
>
> Rob
>
>
>     my $child_pids = 0;
>
>     foreach $hostId ( @hostIds ) {
>
>         my $pid = undef;
>
>         $pid = fork if $child_pids < $MAX_CHILDREN;
>
>         if ($pid > 0) {
>
>             $child_pids++;
>
>         } elsif ( defined $pid ) {
>
>             # $pid == 0 so in the child process
>
>             my $failures = 0;
>
>             while ( $failures < $maxtries ) {
>                 my $result = BACKUP->QuotaIt ( $hostId, $mysqluser,
> $mysqlpasswd ); last if $result;
>                 $failures++;
>             }
>
>             #BLA BLA code
>             #clean up the pid and exit
>
>             exit 0;
>
>         } else {
>
>             # $pid is undefined so fork failed - wait for a spare one
>
>             waitpid -1, WNOHANG;
>             $child_pids--;
>         }
>     }

-- 
chad kellerman  
Jr. Systems Administrator
Alabanza Inc
10 East Baltimore Street
Suite 1500
Baltimore, Md 21202
1-800-361-2662 Ext 3305
410-234-3305 direct

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to