提交后在Slurm中添加作业数组元素

时间:2019-03-21 15:58:23

标签: bash slurm

我正在尝试使用Slurm操作的群集来运行LS-Dyna(有限元素模拟程序在群集上可用的许可证数量有限)。我试图编写我的批处理脚本,以免由于使用许可数组而导致许可证限制(以及提高运行“ squeue”命令时的易读性)而浪费处理时间,但是我无法使该工作正常进行。

我想在各种FEM网格中运行相同的Bash脚本,我将每个网格组织为不同的子文件夹。

鉴于此文件夹结构位于我的群集上...

cluster root
|
...
|
|-+ my scratch space's root
  |
  |-+ this project
    |
    |--+ lat_-5mm
    |  |- runCurrentLine.bash
    |  |- other files
    |
    |--+ lat_-4.75mm
    |  |- runCurrentLine.bash
    |  |- other files
    |
    |--+ lat_-4.5mm
    |  |- runCurrentLine.bash
    |  |- other files
    |
   ...
    |
    |--+ lat_5mm
    |  |- runCurrentLine.bash
    |  |- other files
    |
    |
    |-sendDynaRuns.bash
    |-other dependencies

...我正在尝试通过在登录节点中运行以下脚本来在每个文件夹中提交“ runCurrentLine.bash”。

#!/bin/bash
iter=0
for foldernow in */; do

# change to subdirectory for current line iteration
    cd "./${foldernow}";

# make Slurm and user happy
    echo "sending LS Dyna simulation for ${pos}mm line..."
    sleep 1

# first line only: send batch, and get job ID
    if [ "${iter}" == 0 ];then

# send the batch...
        jobID=$(sbatch -J "Dyna" --array="${iter}"%15 runCurrentLine.bash)

# ...ensure that Slurm's output shows on console (which includes the job ID)...
        echo "${jobID}"

# ...and extract the job ID and save as a variable
        jobID=$(echo "${jobID}" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?')

# subsequent lines: add current line to job array
    else
        scontrol update --jobid="${jobID}" --array="${iter}"%15 runCurrentLine.bash
    fi

# prepare to move onto next position
    iter=$((iter+1))
    cd ../
done

此设置可正确发送第一行的批处理作业,其值为-0.25mm *。然而,从第二行开始,它似乎并没有做同样的事情……这就是我最终在控制台上得到的东西:

*:我打算按数字顺序对“ lat_xmm”文件夹进行排序,但Unix似乎无法识别

$ ./sendDynaRuns.bash
sending LS Dyna simulation for -0.25mm line...
Submitted batch job 1081040
sending LS Dyna simulation for 0.25mm line...
sbatch: error: Batch job submission failed: Invalid job id specified
sending LS Dyna simulation for -0.5mm line...
sbatch: error: Batch job submission failed: Invalid job id specified

我知道,如果我手动批量发送runCurrentLine.bash可以很好地运行(并且它在我在文件中指定的期限内运行完成,主要是因为它不必与其他行竞争打开)许可证)。我应该怎么做才能使我的代码正常工作?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

作为@Poshi的状态,您不能将作业添加到现有阵列。

我将创建一个像这样的提交脚本:

#!/bin/bash
#SBATCH --array=1-<nb of folders>%15
# ALL OTHER SLURM SBATCH DIRECTIVES HERE

folders=(lat_*)
foldernow=${folders[$SLURM_TASK_ARRAY_ID]}

cd $foldernow && ./runCurrentLine.bash

唯一的缺点是您需要根据文件夹数显式设置阵列的作业数。