A slightly longer version using the exec method with forked pipes (and an optional timeout value).
# two parameters:
# cmd - a command or reference to an array of command + arguments
# timeout - number of seconds to wait (0 = forever)
# returns:
# cmd exit status (-1 if timed out)
# cmd results (STDERR and STDOUT merged into an array ref)
sub ExecCmd {
my $cmd = shift || return(0, []);
my $timeout = shift || 0;
# opening a pipe creates a forked process
my $pid = open(my $pipe, '-|');
return(-1, "Can't fork: $!") unless defined $pid;
if ($pid) {
# this code is running in the parent process
my @result = ();
if ($timeout) {
my $failed = 1;
eval {
# set a signal to die if the timeout is reached
local $SIG{ALRM} = sub { die "alarm\n" };
alarm $timeout;
@result = <$pipe>;
alarm 0;
$failed = 0;
};
return(-1, ['command timeout', @result]) if $failed;
}
else {
@result = <$pipe>;
}
close($pipe);
# return exit status, command output
return ($? >> 8), \@result;
}
# this code is running in the forked child process
{ # skip warnings in this block
no warnings;
# redirect STDERR to STDOUT
open(STDERR, '>&STDOUT');
# exec transfers control of the process
# to the command
ref($cmd) eq 'ARRAY' ? exec(@$cmd) : exec($cmd);
}
# this code will not execute unless exec fails!
print "Can't exec @$cmd: $!";
exit 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.
|