【问题标题】:Get SLURM job ID from job started by strigger从触发器启动的作业中获取 SLURM 作业 ID
【发布时间】:2018-10-07 14:04:41
【问题描述】:

我有一个由三部分组成的 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 步?

【问题讨论】:

    标签: r linux batch-processing hpc slurm


    【解决方案1】:

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

    【讨论】:

    • 第二行和第三行是否缺少partB.shpartC.sh?例如应该是$ partB_ID=$(sbatch --parsable --dependency=afterany:${partA_ID} partB.sh)吗?我没有在我的帖子中明确提及它们,所以这可能会造成混淆。
    • 是的,需要指定要提交的脚本
    • 太棒了。如果有人想添加任何内容,我将暂时保持打开状态,但我认为您回答了我的问题!非常感谢:)
    • @RGregStacey 你对丢失的提交脚本名称是正确的,我更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 2015-07-03
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2017-03-12
    相关资源
    最近更新 更多