The major missing feature is that at present there's no way to get it to run cmd -x arg1, cmd -x arg2...; there's no way to get the constant -x in there.
I tried fixing it by changing:
my $cmd = shift;
to:
my @cmd = split /\s+/, shift;
and:
$pid{spawn($cmd, split /\s+/, shift @ARGV)} = 1;
to:
$pid{spawn(@cmd, shift @ARGV)} = 1;
(I also decided that splitting the remaining arguments was a fairly dumb mistake, so got rid of that.)
Now, to get it to run cmd -x arg1, cmd -x arg2...; you just runN "cmd -x" arg1 arg2... .
I think this has worked out pretty well in practice so far, but only time will tell.
Complete code is now:
#!/usr/bin/perl
use Getopt::Std;
my %opt = (n => 1);
getopts('r:n:v', \%opt) or usage();
my @cmd = split /\s+/, shift;
@ARGV = shuffle(@ARGV) if $opt{r};
my %pid;
while (@ARGV) {
if (keys(%pid) < $opt{n}) {
$pid{spawn(@cmd, shift @ARGV)} = 1;
} else {
delete $pid{wait()};
}
}
1 while wait() >= 0;
sub spawn {
my $pid = fork;
die "fork: $!" unless defined $pid;
return $pid if $pid;
warn "@_\n" if $opt{v};
exec @_;
die "exec: $!";
}
sub usage {
print STDERR "Usage: $0 [-n N] [-r] [-v] command arg1 arg2...
Run command arg1, command arg2, etc., concurrently.
Run no more than N processes simultaneously (default 1)
-r: run commands in random order instead of specified order (unimp
+l.)
-v: verbose mode
";
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.