http://qs1969.pair.com?node_id=11142794


in reply to Can I have a Perl script, initiated from a browser, fork itself, and not wait for the child to end?

My suggestion would be to just run your own http event based sever in perl.

Example this would wait for request to http://localhost/doBigThing, then it sends back text message, then it start doing the big fancy database stuff, before going back to waiting again:

use AnyEvent; use AnyEvent::HTTPD; my $httpd = AnyEvent::HTTPD->new (port => 9090); my $cv = AnyEvent->condvar; $httpd->reg_cb ( '/doBigThing' => sub { my ($httpd, $req) = @_; $req->respond ({ content => ['text/html',"OK starting big datab +ase thingy now... I will be busy for several minutes.... " ]}); $cv->send; } ); while (1) { $cv->recv; print "Doing big fancy database stuff for a long time here..."; $cv = AnyEvent->condvar; }
  • Comment on Re: Can I have a Perl script, initiated from a browser, fork itself, and not wait for the child to end?
  • Download Code

Replies are listed 'Best First'.
Re^2: Can I have a Perl script, initiated from a browser, fork itself, and not wait for the child to end?
by bartender1382 (Beadle) on Apr 07, 2022 at 23:05 UTC

    Someone gave name the answer over at:

    StackOverflow User: mob

    In general you must detach the child process from its parent to allow the parent to exit cleanly -- otherwise the parent can't assume that it won't need to handle more input/output.

    } elsif ($pid == 0) { close STDIN; close STDERR; close STDOUT; # or redirect do_long_running_task(); exit;

    In your example, the child process is making print statements until it exits. Where do those prints go if the parent process has been killed and closed its I/O handles?