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

时间:2012-05-23 15:05:52

标签: sungridengine

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

为了将所有作业发送到后台然后等待,我使用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记录任务的错误无论如何万一我需要它。)

1 个答案:

答案 0 :(得分: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,当然。