Hi Chad, I think your error lay in the place where Jenda pointed for you. Going posix way is the right way if you intend to do a lot of low level stuff your self.
Mark ----- Original Message ----- From: "chad kellerman" <[EMAIL PROTECTED]> To: "beginners" <[EMAIL PROTECTED]> Sent: Monday, March 24, 2003 1:58 PM Subject: counting fork process, again > > Helloe everyone, > I was wondering is someone can help me out with an issue with forking. I > am trying to fork 8 process at a time. > > Here is what I have: > > <code snippet> > > #!/usr/bin/perl > use strict; > use warnings; > use lib "."; > use BACKUP; #my own module > use POSIX ":sys_wait_h"; > > my( $MAX_CHILDREN ) = "8"; > my( $CHILD_PIDS ) = "0"; > my( $maxtries ) = "7"; > my( $failure ) = "0"; > > # there are actually 100 hostIds. but you should get the point.. > my( @hostIds ) = "10.10.10.1, 10.10.10.2, 10.10.10.3 ,10.10.10.4"; > > $SIG{CHLD} = \&CHILD_COUNT($CHILD_PIDS); > > FORK: > { > > HOSTID: foreach my $hostId ( @hostIds ) { > > redo HOSTID if $CHILD_PIDS >= $MAX_CHILDREN; > > if( my $pid = fork ) { > $CHILD_PIDS++; #Add the children up until we hit the max > next; > }elsif (defined $pid) { > # In here I do some stuff with each $hostID. > # To make the code easier to read, I made a module that > # has a bunch of subroutines in it. > #There are basically 2 subroutines that I call for each > # hostID. 1 grabs the quota for each user on the hostId, > #The other tars and copies the user where the script > # is. I eval my connection and if some fails I > # go on to the next. ex. > until ( (BACKUP->QuotaIt( $hostId ) or ( $failures == > $maxtries ) ) ) { > $failures++; > if ( $failures == $maxtries ) { > my( $subject ) = "Hey, WTF is up with $hosId"; > my( $message ) = "$0 failed to connect to $hostID."; > BACKUP->MailIt( $subject, $message, $daily ); > #go to the next hostid > next HOSTID2; > } #if statememt > } #until statement > > }elsif($! =~ /No more process/){ > sleep 15; > redo; #do over. > }else{ > # this is just a mail routine that mails be that I > #can't fork > my( $subject ) = "Failed to fork any children"; > my( $message ) = "$0 failed to fork anymore children. > BACKUP->MailIt( $subject, $message, $daily ); > die; > } > > } # foreach loop ends > > } # this is the FORK > > > sub CHILD_COUNT { > my $child_pids = @_; > my $child = waitpid(-1,WNOHANG); > while ($child != -1 && ($child_pids > 0 )) { > $child_pids--; > $child = waitpid(-1,WNOHANG); > } > } > > <end of code snippet> > > Just typing this I realized that if I can't fork then I probably won't be > able to mail myself a notification. So I gotta change that else statement > with the mail notification. > > Anyways, the issues I am having are two fold. The first I get this > warning: > Not a subroutine reference at ./script.pl line 331 which is: > " redo HOSTID2 if $CHILD_PIDS >= $MAX_CHILDREN;" > > The second is a bigger issue. I also fork in the "home made" perl module > for each user of the HostId I am doing. > nothing crazy, just......... > > #----------------------------------------------------------# > foreach $user (@users) { > my( $pid ) = fork (); > die "Cannot fork: $!" unless defined( $pid ); > if ( $pid == 0 ) { > #do tarring of user > exit 0; > } > waitpid($pid,0); > } > #-----------------------------------------------------------# > > Here I get the error: > Not a subroutine reference at BACKUP.pm line 195. > which is: " waitpid($pid,0);" > > I know this is very confusing. And I might not even be posting to the right > list. But I am so frustrated with trying to get this thing to work. It > seems as if I have searched everywhere for examples of limiting the number of > forked processes, then being able to fork with in a fork. > I originally was using Parallel::ForkManager. But I found that if I set > the max_processes to 8 it will start eight but will not contiue until all > eight were done, then only do one at a time. > > That's when I decided to go the POSIX route and use fork.. But just can't > get it working. I think setting the SIG{CHLD} is messing things up. BUt I > am not sure. > > Sorry for being so drawn out. Please feel free to tear me/my code up. I am > new and would really like to know how to do this. Don't worry I can take > criticism pretty well... lol > > Thanks in advance, > > Chad > > > > > > -- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]