:) I think that makes sense. It was created in the child. It seemed to be fixed when I made the connection global. When I tried the connection in the child again it might well have been a lucky transpireing of events that let the child stay alive long enough for the query to get completed. So I should keep it global I think.
Thanks, Eric At 04:24 PM 9/16/03 +0100, Stephen Hardisty wrote: >Hi, >is the database connection created in the child or before it? >If it's created inside the child then it'll die ungracefully when the child >dies, so put something nice and fluffy to close it before the exit. >Otherwise, I don't know I'm afraid. > >-----Original Message----- >From: Eric Frazier [mailto:[EMAIL PROTECTED] >Sent: 16 September 2003 12:57 >To: Stephen Hardisty >Cc: [EMAIL PROTECTED] >Subject: RE: mod_perl v2 Forking > > >Hi, > >Doing this "works" for me. But I am ending up with some errors that I didn't >have before. Of course my bosses would get mad if I posted all of the code >involed, but basicly a database connection that was working fine is now >returning "mysql server has gone away", meaning that the connection got >killed. What is weird/scary, is that if I change your $SIG{CHLD} = 'IGNORE'; >back to the handler I was using, the database error goes away, but I am back >were I was. Fun huh? :) > >Thanks, > >Eric > >At 03:57 PM 9/16/03 +0100, Stephen Hardisty wrote: >>Hi, >>I had a problem with 5.8.1 and forking in that I was either getting zombies >using the 5.6 examples or the parent was dying, depending on which example >was used. The way round I found was to: >> >># ignore the child, good rule for life >>$SIG{CHLD} = 'IGNORE'; >> >># then sort out the socket >>my $server = new IO::Socket::INET(LocalPort => $port, >> Type => SOCK_STREAM, >> Proto => "tcp", >> Listen => 5) >> or die "some error"; >> >># wait for a connection >>while(my $client = $server->accept()) >>{ >> my $pid = fork; >> die "Error. Fork: $!\n" unless defined $pid; >> >> if($pid == 0) >> { >> # all your child code here >> >> # when it's done, kill the child: >> exit(0); >> } >>} >> >>This seemes reasonably stable. If anybody has a better way, then I'm all ears. >> >>Cheers! >> >>-----Original Message----- >>From: Eric Frazier [mailto:[EMAIL PROTECTED] >>Sent: 16 September 2003 12:24 >>To: [EMAIL PROTECTED] >>Cc: [EMAIL PROTECTED] >>Subject: Re: mod_perl v2 Forking >> >> >>Hi, >> >>I guess this is off topic for this list, since I would be doing this no >>matter if I was running CGI or mod_perl or whatever. I am pretty desparate >>to get this working, and if anyone wants to earn some cash helping me fix >>things PLEASE call me at 250 655-9513. >> >>I have been trying to accomplish the same thing as Cameron, but with the >>detaching stuff it seemed a lot easier to make a server with IO::Select and >>not actually start the server from mod_perl. The end result hopefully will >>be a web user being able to start some things that take time, but not screw >>things up by interrupting them. >> >>But then I found I was using 5.8.. Thanks to a guy on comp.lang.perl.misc I >>know that there is a change in how signals are handled, they call it >>deferred signal handling because Perl now is suppose to wait until the >>Interpeter is in a safe state. As I understand it this might avoid some >>things like core dumps or other errors related to dieing while trying to do >>something besides dieing. >> >>The thing is somehow this ends up killing off my parent process, just like >>in this post: >> >>http://www.mail-archive.com/[EMAIL PROTECTED]/msg43989.html >> >>So this is happening to me as well, however the guy in the above example had >>his problem solved by using Errno and looking for EINTR if that error is >>raised then catch it and move on, >> >>I did get one maybe helpfull thing from my log: >> >>Erro was %! -------- >>./franken_socket.pl 8607: got - CHLD >> at Tue Sep 16 02:17:42 2003 >>I got forked >>./franken_socket.pl 8599: begat 8607 at Tue Sep 16 02:17:40 2003 >>begat 8607 >>./franken_socket.pl 8599: got - CHLD >> at Tue Sep 16 02:17:54 2003 >>./franken_socket.pl 8599: main 8607 -- reaped 1 at Tue Sep 16 02:17:54 2003 >>reaped 1Erro was No child processes %! -------- >> >>So it looks like the parent got killed on that error "No child process" >>This code works just fine on 5.6 since it is about 150% from examples :) >>The above is the result of connecting, doing a "who", and doing "dienow" to >>test the alarm. >> >>I also found this: >> >>http://archive.develooper.com/[EMAIL PROTECTED]/msg03022.html >> >>Which totaly describes my problem as well, but shows it happening with perl >>5.8.1.. >> >> >>>I'd imagine that your accept() isn't being restarted. How does it work >>>if you change the loop to look like this? >> >>> use Errno; >> >>> while (1) { >>> my $client = $server->accept or do { >>> next if $!{EINTR}; >>> last; >>> }; >>> spawn(\&function, "whatever"); >>> } >> >>#!/usr/bin/perl -w >> >>## new frankenstein! >> >> use strict; >> use POSIX (); >> use POSIX 'WNOHANG'; >> use Errno; >> use IO::Socket; >> use FindBin (); >> use File::Basename (); >> use File::Spec::Functions; >> use Net::hostent; >> use Carp; >> >> >> $|=1; >> my $pid; >> >>open (DIED, ">>/var/log/daemon_log") or warn "$!"; >>sub logmsg { print DIED "$0 $$: @_ at ", scalar localtime, "\n" } >> >>my $listen_socket = IO::Socket::INET->new(LocalPort => 1081, >> LocalAddr => '127.0.0.1', >> Proto => 'tcp', >> Listen => SOMAXCONN, >> Reuse => 1 ) >>or die "can make a tcp server on port 1080 $!"; >> >> >> # make the daemon cross-platform, so exec always calls the script >> # itself with the right path, no matter how the script was invoked. >> my $script = File::Basename::basename($0); >> my $SELF = catfile $FindBin::Bin, $script; >> # POSIX unmasks the sigprocmask properly >> my $sigset = POSIX::SigSet->new(); >> my $action = POSIX::SigAction->new('sigHUP_handler', >> $sigset, >> &POSIX::SA_NODEFER); >> my $action_alrm = POSIX::SigAction->new('sigALRM_handler', >> $sigset, >> &POSIX::SA_NODEFER); >> >> >> POSIX::sigaction(&POSIX::SIGHUP, $action); >> POSIX::sigaction(&POSIX::SIGALRM, $action_alrm); >> >> sub sigHUP_handler { >> print "got SIGHUP\n"; >> exec($SELF, @ARGV) or die "Couldn't restart: $!\n"; >> } >> sub sigALRM_handler { >> print "got ALARM timeout\n"; >> >> } >> >> $SIG{CHLD} = \&REAPER_NEW; >> >> sub REAPER { >> $SIG{CHLD} = \&REAPER; # loathe sysV >> my $waitedpid = wait; >> logmsg "reaped $waitedpid" . ($? ? " with exit $?" : ''); >> } >> >> sub REAPER_NEW { >> logmsg "got - @_\n"; >> my $wpid = undef; >> while ($wpid = waitpid(-1,WNOHANG)>0) { >> >> logmsg "main $pid -- reaped $wpid" . ($? ? " with exit $?" >: '') >>; >> print DIED "reaped $wpid" . ($? ? " with exit $?" : ''); >> >> } >> } >> >> >> print "PID: $$\n"; >> print "ARGV: @ARGV\n"; >> print "[Server $0 accepting clients]\n"; >> >>#while (my $connection = $listen_socket->accept()) { >>while (1) { >> my $connection = $listen_socket->accept() or do { >> next if $!{EINTR}; >> last; >> }; >> >> print DIED "Erro was $! %! --------\n"; >>$connection->autoflush(1); ## missing seemed to cause client problem, but >>not telnet >> >> if (!defined($pid = fork)) { >> logmsg "cannot fork: $!"; >> >> }elsif ($pid) { >> logmsg "begat $pid"; >> print DIED "begat $pid\n"; >> }else{ >> # else i'm the child -- go spawn >> print $connection "Command?"; >> >> while ( <$connection> ){ >> >> my $return_value = undef; >> >> if (/quit|exit/i) { last; } >> elsif (/closeme/i ) {$connection->close(); } >> elsif (/date|time/i) { printf $connection "%s\n", scalar >>localtime; } >> elsif (/who/i ) { print $connection `who 2>&1`;} >> elsif (/dienow/i ) { alarm 2; } >> elsif (/dieT/i ) { die; } >> >> >> >> #REAPER_NEW($pid) if $return_value; >> >> print $connection "Command?"; >> >> print DIED "I got forked\n"; >>} >> exit(0); >> >> #STDIN->fdopen($connection,"r") || die "can't dup client to stdin"; >> #STDOUT->fdopen($connection,"w") || die "can't dup client to >stdout" >>; >> #STDERR->fdopen($connection,"w") || die "can't dup stdout to >stderr"; >> >> ### FORKed code here.. >> >> } ## end while <$connection> >> >>} ## end else >> >>close ($listen_socket); >> >> >> >> >>At 01:18 AM 9/16/03 -0700, Stas Bekman wrote: >>>Cameron B. Prince wrote: >>> >>>> I have a report generator program written in Perl that I need to start from >>>> a CGI. The program takes about 15 minutes to run, so I must fork or double >>>> fork. I have two goals: >> >>(250) 655 - 9513 (PST Time Zone) >> >>"Inquiry is fatal to certainty." -- Will Durant >> >> >> >> >> >>________________________________________________________________________ >>This email has been scanned for all viruses by the MessageLabs Email >>Security System. For more information on a proactive email security >>service working around the clock, around the globe, visit >>http://www.messagelabs.com >>________________________________________________________________________ >> >>________________________________________________________________________ >>This email has been scanned for all viruses by the MessageLabs Email >>Security System. For more information on a proactive email security >>service working around the clock, around the globe, visit >>http://www.messagelabs.com >>________________________________________________________________________ >> > >(250) 655 - 9513 (PST Time Zone) > >"Inquiry is fatal to certainty." -- Will Durant > > > > > >________________________________________________________________________ >This email has been scanned for all viruses by the MessageLabs Email >Security System. For more information on a proactive email security >service working around the clock, around the globe, visit >http://www.messagelabs.com >________________________________________________________________________ > >________________________________________________________________________ >This email has been scanned for all viruses by the MessageLabs Email >Security System. For more information on a proactive email security >service working around the clock, around the globe, visit >http://www.messagelabs.com >________________________________________________________________________ > (250) 655 - 9513 (PST Time Zone) "Inquiry is fatal to certainty." -- Will Durant