I'm sure there's an easy way around this with fork, but rather than guess at the answer, I'll just present the problem (I've been trying to solve this for a bit).
#!/usr/bin/perl
use strict;
use warnings;
eval {
local $SIG{ALRM} = sub { die "alarm\n" };
alarm 2;
system("perl -e '1 while 1'") == 0
or die "Cannot do infinite loop: $!";
alarm 0;
};
die $@ unless $@ eq "alarm\n";
# the following lines let me do a 'ps awux|grep perl'
# while this is running
print 'Hanging ...';
<STDIN>;
I don't do a huge amount of work with process management, so this is giving me fits. Basically, I sometimes need call code code which may never return but I have no way of knowing in advance if this is the case. I want an alarm to catch when that happens. However, when I do that, the proces is hanging around in the process table. How can I ensure that when the system times out that the process is reaped? I'm making about 10,000 system calls and this is rapidly killing my system.
Update:
I forgot that this isn't a real example of what I need. I also need the result, if any, of the command I execute. My actual code looks like this:
sub timeout {
my ( $package, $timeout, $code ) = @_;
my $result;
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm $timeout;
$result = $code->();
alarm 0;
};
if ($@) {
die "Could not make $package: $@" unless $@ eq "alarm\n"; #
+ propagate unexpected errors
# timed out
}
return $result;
}
timeout( $package, 10, sub {`perl $make_prog 2>&1`} );
-
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.