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