You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Christoph Bergmann <in...@java.seite.net> on 2001/10/06 23:00:11 UTC

how to catch a killed task?

hi...

i use BSD::Resource to limit the ressources of the apache tasks. this
works fine but now i want to clean up afterwards but i don't know how to
catch a killed task... here is what i tried with signals:

my entries in httpd.conf:

PerlModule Apache::Resource
PerlSetEnv PERL_RLIMIT_CPU 120:150
PerlSetEnv PERL_RLIMIT_AS 30000000:35000000
PerlChildInitHandler Apache::Resource

and this is how i tried to catch the signals:

sub cleanup { die "cleanup called..."; }
$SIG{XFSZ} = \&cleanup;

i use linux, thus i have to use RLIMIT_AS and so maybe XFSZ is the wrong
signal for the RAM limit. which do i have to use then?

but i tried $SIG{XCPU} but it doesnt work as well.

it just killed the task at soft limit without calling "cleanup". what is
wrong?

or is there another possibility for cleaning up? probably there is a
handler i can use which will be called when a program is finished, if
so, how can i check if the program has ended as it shoulds or if it was
killed by BSD::resource ?

thanx in advance!

best regards,

christoph bergmann

Re: how to catch a killed task?

Posted by Christoph Bergmann <in...@java.seite.net>.
Perrin Harkins wrote:
> 
> > Perrin Harkins wrote:
> > >
> > > I believe the limiting done by BSD::Resource is pretty harsh and may
> > > actually be at the kernel level.  I don't think you can catch the signal
> and
> > > deal with it yourself.  What you should do is use Apache::SizeLimit to
> > > handle your size constraints, and just use BSD::Resource for extreme
> cases,
> > > i.e. out of control servers in tight loops.
> > >
> >
> > Thanks for your answer, but (I think) I need BSD::Resource because I
> > allow users to write their own scripts (executed with reval from the
> > Safe-Module) and they can write infinite loops or consume memory as they
> > want - Apache::SizeLimit is not harsh enough for this ;-)
> 
> Correct, which is why I said to use both.  SizeLimit catches normal growth,
> and BSD::Resource catches emergencies.  You set the limit for BSD::Resource
> higher than the one for SizeLimit.
> - Perrin

Oops, sorry, I overlooked that. Yes that makes sense...

Best regards,

Christoph Bergmann

Re: how to catch a killed task?

Posted by Perrin Harkins <pe...@elem.com>.
> Perrin Harkins wrote:
> >
> > I believe the limiting done by BSD::Resource is pretty harsh and may
> > actually be at the kernel level.  I don't think you can catch the signal
and
> > deal with it yourself.  What you should do is use Apache::SizeLimit to
> > handle your size constraints, and just use BSD::Resource for extreme
cases,
> > i.e. out of control servers in tight loops.
> >
>
> Thanks for your answer, but (I think) I need BSD::Resource because I
> allow users to write their own scripts (executed with reval from the
> Safe-Module) and they can write infinite loops or consume memory as they
> want - Apache::SizeLimit is not harsh enough for this ;-)

Correct, which is why I said to use both.  SizeLimit catches normal growth,
and BSD::Resource catches emergencies.  You set the limit for BSD::Resource
higher than the one for SizeLimit.
- Perrin


Re: how to catch a killed task?

Posted by Christoph Bergmann <in...@java.seite.net>.
Perrin Harkins wrote:
> 
> I believe the limiting done by BSD::Resource is pretty harsh and may
> actually be at the kernel level.  I don't think you can catch the signal and
> deal with it yourself.  What you should do is use Apache::SizeLimit to
> handle your size constraints, and just use BSD::Resource for extreme cases,
> i.e. out of control servers in tight loops.
> 

Thanks for your answer, but (I think) I need BSD::Resource because I
allow users to write their own scripts (executed with reval from the
Safe-Module) and they can write infinite loops or consume memory as they
want - Apache::SizeLimit is not harsh enough for this ;-)

Best regards,

Christoph Bergmann

Re: how to catch a killed task?

Posted by Perrin Harkins <pe...@elem.com>.
> it just killed the task at soft limit without calling "cleanup". what is
> wrong?

I believe the limiting done by BSD::Resource is pretty harsh and may
actually be at the kernel level.  I don't think you can catch the signal and
deal with it yourself.  What you should do is use Apache::SizeLimit to
handle your size constraints, and just use BSD::Resource for extreme cases,
i.e. out of control servers in tight loops.

> or is there another possibility for cleaning up? probably there is a
> handler i can use which will be called when a program is finished, if
> so, how can i check if the program has ended as it shoulds or if it was
> killed by BSD::resource ?

Put your cleanup code in a PerlChildExitHandler.  Apache::SizeLimit will
allow this to be called, since it uses the $r->child_terminate() call.
BSD::Resource just does a harsh kill.

- Perrin


Re: how to catch a killed task?

Posted by Stas Bekman <st...@stason.org>.
Christoph Bergmann wrote:

> Stas Bekman wrote:
> 
>>Christoph Bergmann wrote:
>>
>>
>>>hi...
>>>
>>>i use BSD::Resource to limit the ressources of the apache tasks. this
>>>works fine but now i want to clean up afterwards but i don't know how to
>>>catch a killed task... here is what i tried with signals:
>>>
>>>...
>>>
>>>
>>Does the following help? (Look at the register_cleanup method)
>>
>>http://thingy.kcilink.com/modperlguide/debug/Safe_Resource_Locking_and_Cleanu.html
>>
>>
> 
> thanks, this works. while playing around with it I found $SIG{__DIE__}
> in your mod_perl guide which fits even better to my needs (I have read
> about the problems as well but I think its ok for me) because the
> connection is still open and I can print out information about what has
> happened.
> 
> one more question: after processing the sub given to $SIG{__DIE__}
> apache prints out an "internal server error" - how can I avoid/suppress
> this?

I've no idea in what setup you are calling this. If it's a registry 
script you just exit. If it's a handler, you should return OK.

But you read 
http://perl.apache.org/guide/perl.html#Exception_Handling_for_mod_perl
aren't you?


_____________________________________________________________________
Stas Bekman             JAm_pH      --   Just Another mod_perl Hacker
http://stason.org/      mod_perl Guide   http://perl.apache.org/guide
mailto:stas@stason.org  http://ticketmaster.com http://apacheweek.com
http://singlesheaven.com http://perl.apache.org http://perlmonth.com/


Re: how to catch a killed task?

Posted by Christoph Bergmann <in...@java.seite.net>.
Stas Bekman wrote:
> 
> Christoph Bergmann wrote:
> 
> > hi...
> >
> > i use BSD::Resource to limit the ressources of the apache tasks. this
> > works fine but now i want to clean up afterwards but i don't know how to
> > catch a killed task... here is what i tried with signals:
> >
> > ...
> >
> 
> Does the following help? (Look at the register_cleanup method)
> 
> http://thingy.kcilink.com/modperlguide/debug/Safe_Resource_Locking_and_Cleanu.html
> 

thanks, this works. while playing around with it I found $SIG{__DIE__}
in your mod_perl guide which fits even better to my needs (I have read
about the problems as well but I think its ok for me) because the
connection is still open and I can print out information about what has
happened.

one more question: after processing the sub given to $SIG{__DIE__}
apache prints out an "internal server error" - how can I avoid/suppress
this?


best regards,

christoph bergmann

Re: how to catch a killed task?

Posted by Stas Bekman <st...@stason.org>.
Christoph Bergmann wrote:

> hi...
> 
> i use BSD::Resource to limit the ressources of the apache tasks. this
> works fine but now i want to clean up afterwards but i don't know how to
> catch a killed task... here is what i tried with signals:
> 
> my entries in httpd.conf:
> 
> PerlModule Apache::Resource
> PerlSetEnv PERL_RLIMIT_CPU 120:150
> PerlSetEnv PERL_RLIMIT_AS 30000000:35000000
> PerlChildInitHandler Apache::Resource
> 
> and this is how i tried to catch the signals:
> 
> sub cleanup { die "cleanup called..."; }
> $SIG{XFSZ} = \&cleanup;
> 
> i use linux, thus i have to use RLIMIT_AS and so maybe XFSZ is the wrong
> signal for the RAM limit. which do i have to use then?
> 
> but i tried $SIG{XCPU} but it doesnt work as well.
> 
> it just killed the task at soft limit without calling "cleanup". what is
> wrong?
> 
> or is there another possibility for cleaning up? probably there is a
> handler i can use which will be called when a program is finished, if
> so, how can i check if the program has ended as it shoulds or if it was
> killed by BSD::resource ?
> 
> thanx in advance!
> 
> best regards,
> 
> christoph bergmann
> 



Does the following help? (Look at the register_cleanup method)


http://thingy.kcilink.com/modperlguide/debug/Safe_Resource_Locking_and_Cleanu.html

-- 


_____________________________________________________________________
Stas Bekman             JAm_pH      --   Just Another mod_perl Hacker
http://stason.org/      mod_perl Guide   http://perl.apache.org/guide
mailto:stas@stason.org  http://ticketmaster.com http://apacheweek.com
http://singlesheaven.com http://perl.apache.org http://perlmonth.com/