You are viewing a plain text version of this content. The canonical link for it is here.
Posted to embperl@perl.apache.org by Matthew Smith <ma...@yahoo.com> on 2006/06/28 18:16:10 UTC
use of STDERR in forked children
Hi, I'm working on a mechanism to fork a a long
running child process. I've followed the standard
mod_perl forking wisdom in
http://modperlbook.org/html/ch10_02.html.
My issue is that warn() doesn't work in the child
process, though printing directly to STDERR does.
Also, I want STDERR to go to the apache log like it
normally would, but I don't know how to determine what
the path to the log is. I can't hard code it since it
changes depending on the environment (dev vs. qa vs.
prod).
I haven't tried this using Apache::Registry (since we
don't run it) but I thought it might be and Embperl
thing since I couldn't find anything on the mod_perl
lists...
I'm using Apache 1.3 and Embperl 1.36
Your help is greatly appreciated.
Here's the code:
[# SNIP #]
[!
use POSIX 'setsid';
use Apache;
!]
[-
my $childPid = undef;
$SIG{CHLD} = 'IGNORE';
if ($childPid = fork) {
$output = "Parent $$ has finished, kid's PID:
$childPid\n";
}
else {
warn "starting child $$\n";
$req_rec->cleanup_for_exec( ); # untie the
socket
chdir '/' or die "Can't chdir
to /: $!";
open STDIN, '/dev/null' or die "Can't read
/dev/null: $!";
open STDOUT, '>/dev/null' or die "Can't write
to /dev/null: $!";
open STDERR, '>>/tmp/log' or die "Can't write
to /tmp/log: $!";
setsid or die "Can't start
a new session: $!";
my $oldfh = select STDERR;
local $| = 1;
select $oldfh;
# ends up in /tmp/log
print STDERR "Where do the children [$$]
play?\n";
# ends up nowhere
warn "Where do the children [$$] play?\n";
# do something time-consuming
for (1..20) {
sleep 1;
warn "$_\n";
}
warn "completed $$\n";
CORE::exit(0); # terminate the process
}
-]
[- $dbgLogLink = 0; -]
<html><head><body>
<xmp>[+ $output +]</xmp>
</body></html>
[# ENDSNIP #]
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
---------------------------------------------------------------------
To unsubscribe, e-mail: embperl-unsubscribe@perl.apache.org
For additional commands, e-mail: embperl-help@perl.apache.org
Re: use of STDERR in forked children
Posted by Angus Lees <gu...@inodes.org>.
On 6/28/06, Matthew Smith <ma...@yahoo.com> wrote:
>
> Hi, I'm working on a mechanism to fork a a long
> running child process. I've followed the standard
> mod_perl forking wisdom in
> http://modperlbook.org/html/ch10_02.html.
>
> My issue is that warn() doesn't work in the child
> process, though printing directly to STDERR does.
You probably want to reset/check $SIG{__WARN__} .
Also you probably want to reset $SIG{PIPE}, from memory.
Also, I want STDERR to go to the apache log like it
> normally would, but I don't know how to determine what
> the path to the log is. I can't hard code it since it
> changes depending on the environment (dev vs. qa vs.
> prod).
I thought STDERR in the apache process already went to the logfile? In
which case, just don't change it in your child..
--
- Gus