我遇到了一个简化一系列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? 谢谢!
答案 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}