R-从Strigger启动的工作中获取Slurm Job ID



i具有由三个部分(partApartBpartC(组成的R分析。我将每个部分提交给slurm(例如sbatch partA(,每个部分通过#SBATCH --array=1-1500并行。零件是串行的,因此我需要等待一个零件才能完成,然后再开始下一个。现在,我正在手动开始每份工作,但这不是一个很好的解决方案。

我想自动化三个sbatch调用。

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

我使用此解决方案获取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中的"重要说明"(。

在您的情况下,您应该一次提交所有三个工作,其中设置了依赖项。

例如:

$ 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部分。

最新更新