0

我有一个 Perl 脚本,它向 SGE 提交了一堆数组作业。我希望所有作业并行运行以节省时间,并且脚本等待它们全部完成,然后继续下一个处理步骤,该步骤集成来自所有 SGE 输出文件的信息并生成最终输出。

为了将所有作业发送到后台然后等待,我使用 Parallel::ForkManager 和一个循环:

$fork_manager = new Parallel::ForkManager(@as); 
# @as: Max nb of processes to run simultaneously
for $a (@as) {
    $fork_manager->start and next; # Starts the child process
    system "qsub <qsub_options> ./script.plx";
    $fork_manager->finish; # Terminates the child process
}
$fork_manager->wait_all_children; 
<next processing step, local>

然而,为了让“等待”部分工作,我不得不在 qsub 选项中添加“-sync yes”。但作为一个“副作用”,SGE 会为每个数组作业中的每个任务打印退出代码,并且由于有许多作业并且单个任务很轻,因此由于所有这些中断消息,它基本上使我的 shell 无法使用,而qsub 作业正在运行。

我怎样才能摆脱这些消息?如果有的话,我有兴趣检查 qsub 的作业退出代码(这样我可以在下一步之前检查一切是否正常),但不是每个任务的一个退出代码(无论如何我通过选项 -e 记录任务的错误以防我需要它)。

4

1 回答 1

0

最简单的解决方案是将输出从 qsub 重定向到某个地方,即

system("qsub <qsub options> ./script.plx >/dev/null 2>&1");

但这掩盖了您可能希望看到的错误。或者,您可以使用 open() 启动子进程并读取它的输出,仅在子进程生成错误时打印一些内容。

不过,我确实为您提供了替代解决方案。您可以在没有 -sync y 的情况下将作业提交给 SGE,并在 qsub 打印时捕获作业 ID。然后,将您的摘要和结果收集代码转换为后续工作,并根据第一个工作的完成情况提交它。您可以使用 -sync y 提交此最终作业,以便您的调用脚本等待它结束。请参阅 qsub 手册页中的 -hold_jid 文档。

此外,不要让您的调用脚本决定何时提交下一个作业(最多),而是使用 SGE 的 -tc 选项来指定同时作业的最大数量(注意 -tc 不在手册页中,但它在 qsub 的 -help 输出中)。当然,这取决于您使用足够新版本的 SGE 来拥有 -tc。

于 2012-05-24T04:25:29.113 回答