Hey Torsten, I hope you don't think I was disparaging (
http://dict.leo.org/?lang=en&lp=ende&search=disparaging ) your help, I
certainly wasn't and I want to thank you for it. I was just lamenting
on a lack of a clear simple example to use as a starting point, much
like almost every programming language starts out with "Hello World" in
the first chapter.
So yes, install ModPerl::Something and then use
ModPerl::Something::Spawn would be great, and it could even come with
some caveats on how leaving it like that could cause problems, and then
people could use that as a starting point.
Anyway, I'm just waiting for a couple days with my simple solution in
production to see if it causes any problems and then I'll post it here
and try to get something that could be such a starting point.
Tosh
Torsten Förtsch wrote:
On Saturday 20 February 2010 19:25:39 Tosh Cooey wrote:
I do enjoy the fact that nobody really seems to have a simple definitive
vanilla fork/spawn process down pat, it seems everyone does what I do,
trying this and that stumbling about until they come up with some
monstrosity like Torsen has that works under the sheer weight of tricks.
Well, if I'd said: "Tosh take ModPerl::Something from CPAN and call
ModPerl::Something::spawn" you'd liked it (no matter what it does internally),
right?
That sheer weight of tricks comes down to 3 points:
- you have to close the client socket in the child process or the browser will
wait for more data
- if your process should survive an apache restart it must create its own
process group, hence the setsid().
- accidental leaking file descriptors to child processes is generally
considered a security hole
This is what my function does, it closes all file descriptors except for
STDERR and calls setsid, nothing special. Perhaps it would be good to reopen
STDIN and STDOUT as /dev/null because many programs don't like closed
STDIN/STDOUT but again, no tricks.
A tricky part would be to really restore the normal Perl environment if you
don't want to exec() another program but simply to call a Perl function.
Reverting the effect of *CORE::GLOBAL::exit=\&ModPerl::Util::exit in an
already compiled function, that is tricky. Or reestablish the connection
between %ENV and C-level char *environ[].
Torsten
--
McIntosh Cooey - Twelve Hundred Group LLC - http://www.1200group.com/