从 strigger 启动的作业中获取 SLURM 作业 ID
Get SLURM job ID from job started by strigger
我有一个由三部分组成的 R 分析(partA
、partB
和 partC
)。我将每个部分提交给 SLURM(例如 sbatch partA
),每个部分都通过 #SBATCH --array=1-1500
并行化。这些部分是连续的,所以我需要等一个完成再开始下一个。现在我手动开始每项工作,但这不是一个很好的解决方案。
我想自动执行三个 sbatch 调用。 例如:
sbatch partA
- 当
partA
完成后,sbatch partB
- 当
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
部分。
我有一个由三部分组成的 R 分析(partA
、partB
和 partC
)。我将每个部分提交给 SLURM(例如 sbatch partA
),每个部分都通过 #SBATCH --array=1-1500
并行化。这些部分是连续的,所以我需要等一个完成再开始下一个。现在我手动开始每项工作,但这不是一个很好的解决方案。
我想自动执行三个 sbatch 调用。 例如:
sbatch partA
- 当
partA
完成后,sbatch partB
- 当
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
部分。