SGE网格作业依赖

时间:2016-10-06 03:47:42

标签: linux sungridengine

我遇到了一个简化一系列SGE网格作业的困境,这些作业在它们之间存在一定的依赖关系但尚未找到指定-hold_jid的正确方法。

假设我们有以下工作:

job1: qsub -N job1 ... 
job2: qsub -N job2 -hold_jid job1
job3: qsub -N job3 -hold_jid job2

然后保证执行顺序为job1-> job2-> job3。

但是,假设在复杂的job2中,有一个嵌入式SGE作业,比如job2a:

job2a: qsub -N job2a.${timestamp_of_submission}

在这种情况下,我还没有找到一种方法来确保在job2a完成后运行job3。

attempt1:

qsub -N job3 -hold_jid job2 ...

然后肯定job3会等到job2完成,但是,不能保证job3a会在job2a之后执行,这就是我想要的。

ATTEMPT2:

qsub -N job3 -hold_jid job2a* ...

然后job3似乎立即被执行,因为job2a没有显示在作业数组中,直到job2开始运行。注意我使用上面的*来避免指定job2a的确切名称,因为提交的时间戳很难预先猜测。

任何人都知道如何实现依赖链作为job1-> job2-> job2a> job3? 谢谢!

1 个答案:

答案 0 :(得分:1)

您是否尝试过提供-hold_jid作业ID列表:

qsub -N job2
qsub -N job2a
qsub -N job3 -hold_jid job2,job2a.${timestamp_of_submission}

或者,捕获作业ID也应该有效:

job2a=$(qsub -N job2a.${timestamp_of_submission} | perl -p -e "s/Your job (\d+) .*/\1/g;")
qsub -N job3 -hold_jid job2,${job2a}

修改

根据评论,您需要获取职位ID列表。

所以我建议如下:

job2list=$(qsub -N job2 | perl -p -e "s/Your job (\d+) .*/\1/g;")

以上内容存储了作业2的作业ID。

然后每次提交job2a类型的工作时都要执行:

job2a=$(qsub -N job2a.${timestamp_of_submission} | perl -p -e "s/Your job (\d+) .*/\1/g;")
job2list="${job2list},${job2a}"

上面会将job2a作业ID附加到job2的id。

准备好提交工作时3:

qsub -N job3 -hold_jid ${job2list}