Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: mod_perl and lazy zombies

by mugwumpjism (Hermit)
on Jun 07, 2001 at 19:07 UTC ( [id://86583]=note: print w/replies, xml ) Need Help??


in reply to mod_perl and lazy zombies

If you really don't care about the return code, you could set:

$SIG{CHLD} = "IGNORE";

And you should not have to worry about the zombies on most platforms. See the <cite>perlipc(1p)</cite> man page and search for CHLD for a little discussion on that.

Replies are listed 'Best First'.
Re: Re: mod_perl and lazy zombies
by gildir (Pilgrim) on Jun 07, 2001 at 20:00 UTC
    Yes and no.

    Yes. You get rid of zombies on some systems, but you should rather use

    use POSIX ":sys_wait_h"; $SIG{CHLD} = sub { my $kid; do { $kid = waitpid(-1,&WNOHANG); } until $kid == -1; }
    This will collect all the zombies immediatly as they become 'undead'.

    No. This will not solve the problem of missing close. When open(FH,'...|') is called, pipe is created as a pair of file descriptors. These fil desrciptors will not be reused until explicitly closed by close syscall. Therefore if your program will serve thousands of requests in one process you will run out of file descriptors. One possible solution to this is to specify MaxRequestsPerChild 200 Apache configuration directive to limit one server process to serve only 200 requests before it dies. But the whole idea of long-running mod_perl precesses is somehow hindered by this.

Re: Re: mod_perl and lazy zombies
by Odud (Pilgrim) on Jun 07, 2001 at 19:24 UTC
    I wasn't too worried about them - after all the numbers weren't increasing - it was just odd to see them appear on a previous clean machine. I've always felt that in general they are Not A Good Thing to have and a sign that something odd may be happening.
    Pete

      All Zombie process are are child processes that have exited, but their parent hasn't called wait() yet to see what the child's return code was. They don't consume any resources except a process table entry.

      When the child exits/dies, the parent gets sent SIGCHLD to notify it. If it doesn't call wait() in that signal handler, the child stays a zombie until wait() is called. If you haven't defined a signal handler, the default action will be to leave it as a zombie - after all, how does the OS know that you're not going to want that return code later?

      Library calls like system() do the wait() for you. popen doesn't. That's what close FH is effectively doing on a popen'ed filehandle.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://86583]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (3)
As of 2024-04-19 19:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found