bar*_*ter 4 parallel-processing perl exit-code
下面的Perl包装器并行执行命令,将STDOUT和STDERR保存到/ tmp文件:
open(A,"|parallel");
for $i ("date", "ls", "pwd", "factor 17") {
print A "$i 1> '/tmp/$i.out' 2> '/tmp/$i.err'\n";
}
close(A);
Run Code Online (Sandbox Code Playgroud)
如何从各个命令获取退出状态值?
GNU Parallel 20110722 有退出值和信号--joblog:
parallel --joblog /tmp/log false ::: a
cat /tmp/log
Seq Host Starttime Runtime Send Receive Exitval Signal Command
1 : 1311332758 0 0 0 1 0 false a
Run Code Online (Sandbox Code Playgroud)
要获得各个作业的存在状态,parallel需要在某处写入信息.我不知道是不是.如果没有,你可以自己做.
my %jobs = (
"date" => "date",
"ls" => "ls",
"pwd" => "pwd",
"factor" => "factor 17",
);
open(my $parallel, "|parallel");
for my $id (keys(%jobs)) {
print $parallel
$jobs{$id}
." 1> '/tmp/$id.out'"
." 2> '/tmp/$id.err' ; "
."echo \$?"
." > '/tmp/$id.exit'\n";
}
close($parallel);
my $exit_status = $? >> 8;
if ($exit_status >= 255) {
print("Failed\n");
} else {
printf("%d failed jobs\n", $exit_status);
}
for my $id (keys(%jobs)) {
...grab output and exit code from files...
}
Run Code Online (Sandbox Code Playgroud)
更新:我去安装了parallel.
它有一个选项--joblog {file},用于生成带退出代码的报告.-如果要将其输出到STDOUT,它接受文件名.
请注意,parallel不能通过信号识别异常死亡,因此--joblog报告中不包含此信息.使用我上面发布的解决方案,缺少.exit文件将表明异常死亡.(但你必须确保它首先不存在.)