避免在 SGE 中打印作业退出代码,选项为 -sync yes



我有一个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 记录任务的错误,以防我需要它(。

最简单的解决方案是将 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。

最新更新