I guess you could, but if there's already a load of code mightn't be a bit of a pain POE-ing it?
-----Original Message----- From: Gareth Kirwan [mailto:[EMAIL PROTECTED] Sent: 16 September 2003 16:50 To: 'Eric Frazier'; Stephen Hardisty Cc: [EMAIL PROTECTED] Subject: RE: mod_perl v2 Forking Haven't read much of this thread, but is POE an option ? > -----Original Message----- > From: Eric Frazier [mailto:[EMAIL PROTECTED] > Sent: 16 September 2003 13:17 > To: Stephen Hardisty > Cc: [EMAIL PROTECTED] > Subject: RE: mod_perl v2 Forking > > > :) 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 > > > > ________________________________________________________________________ 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 ________________________________________________________________________