Maybe it does or doesn't work under MP::R, the answer to that is perhaps individual.

Anyway, the solution, at least so far until I run into other problems, seems to be to just make a system() call and the called program uses Proc::Daemon and things *seem* to work fine in testing, we'll see when it hits production...

Tosh



Fred Moyer wrote:
I haven't been following this thread too closely, but is there a
reason you aren't using PerlHandlers instead of ModPerl::Registry?
MP::R is meant mostly for CGI migration, so it is probably not widely
tested with Apache2::SubProcess calls.  I'd suggest trying your
external call under a PerlHandler instead and see if that works.

On Fri, Feb 19, 2010 at 1:52 PM, Tosh Cooey <t...@1200group.com> wrote:
Seriously, you know what, the code below doesn't even work.

And if I get rid of the redirect and replace it with some nice pretty text:

print "Content-type: text/html\n\nTesting";

You know what?  The warning for 1 (from the 'for' loop) is printed and then
it all stops, probably as the browser connection "closes".

Hiding it behind more forks made it work once but then never again.

So it is my belief that Apache2::SubProcess sucks dirty things, and that
belief won't change until I see proof to the contrary.

On a related note, anyone have tips for avoiding zombies in CGI forking?

Tosh



Tosh Cooey wrote:
Hi after much trial and all error I am seeing that the browser connection
closing is also stopping my subprocess.

The main ModPerl::Registry program looks like this:
### file.pl ###
use Apache2::SubProcess ();
use JSON();

&main(shift);

sub main {
 my $r = shift;
 ...
 $r->spawn_proc_prog ('/web/html/file_fork.pl', \...@argv);
 return print $cgi->redirect('index.pl');
}
###

And

### file_fork.pl ###
use JSON();
use warnings;
use POSIX 'setsid';
chdir '/'                or die "Can't chdir to /: $!";
open STDIN, '/dev/null'  or die "Can't read /dev/null: $!";
open STDOUT, '+>>', '/tmp/debug.txt' or die "Can't write to
/tmp/debug.txt: $!";
open STDERR, '>&STDOUT'  or die "Can't dup stdout: $!";
setsid or die "Can't start a new session: $!";

 # run your code here or call exec to another program
foreach my $num (1..10) {
 warn $num;
 sleep(1);
}
###

When file.pl is executed it calls file_fork.pl and file_fork starts to
print 1, 2, 3 and then stops around 2 or 3 depending on how long my browser
is connected.

Are there any glaring errors that anyone sees?  It should work shouldn't
it, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 after 10 seconds...

Thank-you all!

Tosh


--
McIntosh Cooey - Twelve Hundred Group LLC - http://www.1200group.com/



--
McIntosh Cooey - Twelve Hundred Group LLC - http://www.1200group.com/

Reply via email to