从 strigger 启动的作业中获取 SLURM 作业 ID

Get SLURM job ID from job started by strigger

我有一个由三部分组成的 R 分析(partApartBpartC)。我将每个部分提交给 SLURM(例如 sbatch partA),每个部分都通过 #SBATCH --array=1-1500 并行化。这些部分是连续的,所以我需要等一个完成再开始下一个。现在我手动开始每项工作,但这不是一个很好的解决方案。

我想自动执行三个 sbatch 调用。 例如:

  1. sbatch partA
  2. partA 完成后,sbatch partB
  3. partB 完成后,sbatch partC

我使用 this solution 获取 partA 的作业 ID,并将其传递给 strigger 以完成上述第 2 步。但是我被困在了那个时候,因为 我不知道如何从 strigger 中获取 partB 的工作 ID。这是我的代码的样子:

#!/bin/bash

# step 1: sbatch partA
partA_ID=$(sbatch --parsable partA.sh)

# step 2: sbatch partB
strigger --set --jobid=$partA_ID --fini --program=/path/to/partB.batch

# step 3: sbatch partC
... ?

如何完成第 3 步?

strigger 不是实现该目标的合适工具,它更多地针对管理员而不是普通用户。只有slurm user可以实际设置触发器(参见strigger manpage中的"Important note")。

在您的情况下,您应该一次提交所有三个作业,并在它们之间设置依赖关系。

例如:

$ partA_ID=$(sbatch --parsable partA.sh)
$ partB_ID=$(sbatch --parsable --dependency=afterany:${partA_ID} partB.sh)
$ partC_ID=$(sbatch --parsable --dependency=afterany:${partB_ID} partC.sh)

这将提交三个作业数组,但第二个只会在第一个作业中的所有作业完成后才开始。而第三个只有在第二个中的所有作业都完成后才会开始。

替代方案可以是

$ partA_ID=$(sbatch --parsable partA.sh)
$ partB_ID=$(sbatch --parsable --dependency=aftercorr:${partA_ID}  partB.sh)
$ partC_ID=$(sbatch --parsable --dependency=aftercorr:${partB_ID}  partC.sh)

这将提交三个作业数组,但第二个作业的所有作业都不会开始,直到第一个作业中的相应作业(即具有相同 $SLURM_ARRAY_TASK_ID 的作业)完成。而第三个中的所有作业只有在第二个中相应的作业完成后才会开始。

有关详细信息,请参阅 sbatch manpage 中的 --dependency 部分。