将参数传递到Slurm脚本

时间:2019-06-18 21:18:20

标签: arrays bash matlab slurm sbatch

我正在使用Slurm脚本在群集上运行用于Matlab计算的数组。每个脚本使用一个数组来循环一个matlab参数。

1)是否可以创建一个Shell脚本来循环另一个变量?
2)我可以将变量传递到Slurm脚本吗?

例如,我的Slurm文件当前看起来像

#!/bin/bash
#SBATCH --array=1-128
...
matlab -nodesktop r "frame=[${SLURM_ARRAY_TASK_ID}]; filename=['Person24']; myfunction(frame, filename);";

我经常需要运行此数组来处理许多不同的文件。这意味着我将提交作业(批处理exampleScript.slurm),编辑文件,将“ Person24”更新为“ Person25”,然后重新提交作业。当我要处理大量文件时,这效率很低。

我可以制作一个将变量传递给Slurm脚本的Shell脚本吗?例如,如下所示:

Shell脚本(myshell.sh)

#!/bin/bash
for ((FNUM=24; FNUM<=30; FNUM+=1));
do
     sbatch myscript.slurm  >> SOMEHOW PASS ${FNUM} HERE (?)
done 

Slurm脚本(myscript.slurm)

#!/bin/bash
#SBATCH --array=1-128
...
matlab -nodesktop -nodisplay r "frame=[${SLURM_ARRAY_TASK_ID}]; filename=[${FNUM}]; myfunction(frame, filename);";

我可以使用类似的方法有效地提交所有工作 分割myshell.sh

谢谢!

1 个答案:

答案 0 :(得分:1)

为了避免名称与shell和环境变量发生冲突,在Bash脚本中始终使用小写或大小写混合的变量是个好习惯。

您快到了。您只需要将变量作为参数传递给第二个脚本,然后根据位置参数在第二个脚本中进行选择即可。在这种情况下,您似乎只传递了一个参数,因此可以使用$1。在其他情况下,如果使用固定数量的多个参数,则也可以使用$2$3等。使用可变数量的参数“ $ @”会更合适。

Shell脚本(myshell.sh)

#!/bin/bash
for ((fnum=24; fnum<=30; fnum+=1))
do
     sbatch myscript.slurm "$fnum"
done 

Slurm脚本(myscript.slurm)

#!/bin/bash
#SBATCH --array=1-128

fnum=$1

...
matlab -nodesktop -nodisplay r "frame=[${slurm_array_task_ID}]; filename=[${fnum}]; myfunction(frame, filename);";

对于处理various timeout conditions,这可能有效:

A=$(sbatch --parsable a.slurm)

case $? in
    9|64|130|131|137|140)
        echo "some sort of timeout occurred"
        B=$(sbatch --parsable --dependency=afternotok:$A a.slurm)
        ;;
    *)
        echo "some other exit condition occurred"
        ;;
esac

您只需要确定要处理的条件以及处理方式。我列出了所有可能涉及超时的事件。