我有一个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记录任务的错误无论如何万一我需要它。)
答案 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,当然。