[prev in list] [next in list] [prev in thread] [next in thread]
List: apache-modperl
Subject: Re: Very special handler
From: Tosh Cooey <tosh () 1200group ! com>
Date: 2010-09-07 9:56:39
Message-ID: 4C860C57.60206 () 1200group ! com
[Download RAW message or body]
I'd love to know too if anyone has an answer to this...
Tosh
On 7/22/64 8:59 PM, Tobias Wagener wrote:
> Hello,
>
> my config:
> Apache/2.2.16 (Debian)
> mod_ssl/2.2.16
> OpenSSL/0.9.8o
> mod_apreq2-20090110/2.7.1
> mod_perl/2.0.4
> Perl/v5.10.1
>
> I have a very large project based on mod_perl and sometimes a process
> is running "wild". But I can't identify which one it is, because on my
> development plattform this does not happend, only on the productive
> system.
>
> So I write a small handler (see below) which I init with
> PerlChildInitHandler Handler::SigUSR2->childInit
> <VirtualHost ...>
> PerlTransHandler Handler::SigUSR2->requestInit
> </VirtualHost>
>
> With this handler I can send a kill -USR2<PID> to the apache2
> process that's running "wild" and the sighandler writes the
> URI to the apache error_log.
>
> My question is now, if someone who knows linux/apache/mod_perl better
> than me, can take a look at the handler and can tell me if this is
> dangerous or time consuming. On my development system I can't regocnize
> anything that took longer or so, but before transfering this code
> to the productiv system I will be sure, that nothing can happen.
>
> Or, perhaps, someone can tell me another way to get the request
> an apache process is currently handling.
>
> Thanks for your help!
>
> Regards Tobias
>
> ------------------------ code here ---------------------
>
> package Handler::SigUSR2;
>
> # Created: 2010-09-03 08:13:42
> # SVN: $Id$
>
> use strict;
> use utf8;
> use Apache2::RequestUtil;
> use POSIX qw(SIGUSR2);
>
> sub childInit {
> # Ignore SIGUSR2 by default
> my( $mask ) = POSIX::SigSet->new( SIGUSR2 );
> my( $action ) = POSIX::SigAction->new( sub{}, $mask );
> my( $old ) = POSIX::SigAction->new();
> POSIX::sigaction(SIGUSR2, $action, $old );
> }
>
> sub requestInit {
> # on request redirect SIGUSR2 to "requestCleanup"
> my( $type ) = shift;
> my( $req ) = shift;
> my( $self ) = bless [], $type;
> my( $mask ) = POSIX::SigSet->new( SIGUSR2 );
> my( $action ) = POSIX::SigAction->new(
> sub { $self->writeRequest(); }, $mask );
> my( $old ) = POSIX::SigAction->new();
> POSIX::sigaction(SIGUSR2, $action, $old );
> $req->push_handlers(PerlCleanupHandler => sub{ $self->requestCleanup });
> push( @$self, $req, $old );
> Apache2::Const::OK();
> }
>
> sub requestCleanup {
> # after request redirect SIGUSR2 to old "ignore" method
> my( $self ) = shift;
> POSIX::sigaction(SIGUSR2, $self->[1]);
> Apache2::Const::OK();
> }
>
> sub writeRequest {
> # print URI to STDERR
> # perhaps "args" or something can also be applied
> my( $self ) = shift;
> my( $req ) = $self->[0];
> printf STDERR "SIGUSR2[%s][%s]\n", $$, $req->uri;
> }
>
> 1;
>
>
--
McIntosh Cooey - Twelve Hundred Group LLC - http://www.1200group.com/
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic