Два варианта:
use IPC::Open3 qw( open3 );
sub launch {
open(local *CHILD_STDIN, '<', '/dev/null') or die $!;
return open3('<&CHILD_STDIN', '>&STDOUT', '>&STDERR', @_);
}
my %children;
for my $cmd (@cmds) {
print "Command $cmd started at ".localtime."\n";
my $pid = launch($cmd);
$children{$pid} = $cmd;
}
while (%children) {
my $pid = wait();
die $! if $pid < 1;
my $cmd = delete($children{$pid});
print "Command $cmd ended at ".localtime." with \$? = $?."\n";
}
Я использую open3
, поскольку он короче, чем четный тривиальный fork
+ exec
, и поскольку он не ошибочно приписывает exec
ошибки команде, которую вы запускаете, как тривиальный fork
+ exec
.
use threads;
my @threads;
for my $cmd (@cmds) {
push @threads, async {
print "Command $cmd started at ".localtime."\n";
system($cmd);
print "Command $cmd ended at ".localtime." with \$? = $?."\n";
};
}
$_->join() for @threads;