[Omaha.pm] Alarms in Perl.
Jay Hannah
jay at jays.net
Tue Oct 30 15:30:10 PDT 2007
On Oct 25, 2007, at 11:08 AM, Daniel Linder wrote:
> What I would like to setup is a simple alarm based action that
> would exit
> the script -- no matter what -- if it was still running after an
> extended
> period of time.
Your example seems overly complicated to me. I think all you need is
$SIG{ALRM} and alarm().
$ cat j.pl
local $SIG{ALRM} = \&timeout;
alarm(5);
sleep 10; # My "long_running_code()"
print "I did not time out. \n";
exit;
sub timeout {
print "Timed out\n";
exit;
}
$ perl j.pl
Timed out
That said, I'll take a stab at your questions...
> 1: Will (should) this work even if the "long_running_code()" uses
> system()
> and or back-ticks to call out to external programs? (I realize those
> programs could be left running - I'm ok with having the admin clean
> them
> up once they are alerted to the code not returning at all...)
... I haven't studied Object::Destroyer, but it's probably a safe bet
that all children process will terminate when your parent process
(your Perl program) does.
> 2: Are the alarm() and Object::Destroyer calls part of the base Perl
> modules, or will I be visiting CPAN to get this working? (How do I
> check
> what's included out of the box vs. what has been installed over time?)
You should be able to see what has been installed after Perl via:
perldoc perllocal
> 3: Is there any command-line magic that perl can be invoked with
> that will
> cause Perl to call a specific function if it is left running for a
> long
> period of time? (i.e. perl --timeout 300 --timeout-sub
> 'MyExitSubroutine()' ./MyBigPerlScript.pl)
Whatever you set $SIG{ALRM} to is what will get called if the kernel
sends the ALRM signal.
I wouldn't think you would want that to be based on a command-line
argument, but if you did maybe you could try something like:
$SIG{ALRM} = eval{ "\&$ARGV[0]" };
My favorite way of handling --timeout-sub args is via Getopt::Long.
It's groovy.
HTH,
j
More information about the Omaha-pm
mailing list