我正在尝试使用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可以很好地运行(并且它在我在文件中指定的期限内运行完成,主要是因为它不必与其他行竞争打开)许可证)。我应该怎么做才能使我的代码正常工作?
提前谢谢!
答案 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
唯一的缺点是您需要根据文件夹数显式设置阵列的作业数。