【问题标题】:SGE grid job dependencySGE 网格作业依赖性
【发布时间】:2016-10-11 20:45:20
【问题描述】:

我在简化一系列 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}

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

尝试1:

qsub -N job3 -hold_jid job2 ...

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

尝试2:

qsub -N job3 -hold_jid job2a* ...

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

任何人都知道一种实现依赖链作为job1->job2->job2a->job3的方法吗? 谢谢!

【问题讨论】:

标签: linux sungridengine


【解决方案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}

【讨论】:

  • 谢谢,但这对我不起作用:在我的情况下,我尝试了 -hold_jid job2,job2a*,因为确实有多个 job2a 的子作业,都具有相同的前缀“job2a”。在运行时,job3 确实等待 job2 完成,但没有等待任何 job2a* 作业完成。
  • 澄清一下,您是否将所有 job2a 作业 ID 添加到 -hold_jid 选项,或者您是否使用了通配符 (*)?
  • 我使用通配符是因为无法即时枚举所有作业名称,即提交的时间戳列表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多