【问题标题】:Passing a parameter into a slurm script将参数传递给 slurm 脚本
【发布时间】:2019-11-01 13:47:52
【问题描述】:

我正在使用 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);";

我经常需要运行这个数组来处理许多不同的文件。这意味着我将提交作业(sbatch 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);";

我可以使用类似的东西有效地提交所有作业 sbatch myshell.sh

谢谢!

【问题讨论】:

    标签: arrays bash matlab slurm sbatch


    【解决方案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
    

    您只需要决定要处理哪些条件以及如何处理它们。我列出了所有似乎涉及超时的问题。

    【讨论】:

    • 谢谢!另一个相关问题——我知道我也可以使用编码格式向管道添加依赖项 'A=$(sbatch --parsable a.slurm) B=$(sbatch --parsable --dependency=afternotok:$A a.slurm)'。如果 A 失败,这将运行 B。运行这些脚本时,我偶尔会遇到超时问题。你知道是否有办法检查A的退出代码是否由于超时而特别失败(不是其他失败),在这种情况下再调用B?
    • @KatieOzgun:我对 slurm 一无所知,但我在答案中添加了一些可能会有所帮助的内容。您可能应该考虑提出一个新的单独问题。
    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多