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
________________________________________________________________________

Reply via email to