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]