I'm trying to figure out an effective way of timing out
shell commands in Perl. At several places I've looked
the canonical solution appears to be something like...
eval {
local $SIG{ALRM} = sub { die "TIMEDOUT" };
alarm(10);
<command>
alarm(0);
};
if ($@) {
die $@ unless $@ =~ /TIMEDOUT/;
# command timed out
...
}
...
If "command" is an internal perl command this works
fine. If it is an external comand (e.g. system(), backticks,
etc.) the code above is executed just fine, but the child
continues to execute as well rather than dying on the spot.
I guess I should expect this since I'm assuming that
the exception has
longjmp'd past the code that would reap the child.
I suppose another way of handling this would be to use a
pipe open like this...
$pid = open(PIPE, "$command |") or die $!;
eval {
local $SIG{ALRM} = sub { die "TIMEDOUT" };
alarm(10);
while (<PIPE>) { <do whatever> };
close(PIPE);
alarm(0);
};
if ($@) {
die $@ unless $@ =~ /TIMEDOUT/;
kill 9, $pid;
close(PIPE); ## needed??
$? ||= 9;
}
I'm probably being overly paranoind, but
this all seems rather cheesy. If the close is outside the
eval, it seems like it won't catch cases where the child
closes STDOUT/STDERR but decides not to quit (not sure
if that happens much). If it is inside the eval, as above,
will things get cleaned up properly within Perl if the code
breaks out while in the close? Is there something better?
Thanks
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.