将参数传递给 slurm 脚本
Passing a parameter into a slurm script
我正在使用 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',然后重新提交作业。当我有大量文件要处理时,这是非常低效的。
我可以制作一个 shell 脚本来将变量传递给 slurm 脚本吗?例如,像这样:
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
谢谢!
为了避免可能与 shell 和环境变量发生名称冲突,在 Bash 脚本中始终使用小写或混合大小写变量是一个好习惯。
你快到了。您只需要将变量作为参数传递给第二个脚本,然后根据位置参数在那里获取它。在这种情况下,看起来您只传递了一个参数,因此 </code> 可以使用。在其他情况下,对于固定数量的多个参数,您还可以使用 <code>
、</code> 等。对于可变数量的参数,“$@”会更合适。</p>
<h3>Shell 脚本 (myshell.sh)</h3>
<pre><code>#!/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=
...
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
您只需要决定要处理什么条件以及如何处理它们。我已经列出了所有似乎涉及超时的。
我正在使用 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',然后重新提交作业。当我有大量文件要处理时,这是非常低效的。
我可以制作一个 shell 脚本来将变量传递给 slurm 脚本吗?例如,像这样:
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
谢谢!
为了避免可能与 shell 和环境变量发生名称冲突,在 Bash 脚本中始终使用小写或混合大小写变量是一个好习惯。
你快到了。您只需要将变量作为参数传递给第二个脚本,然后根据位置参数在那里获取它。在这种情况下,看起来您只传递了一个参数,因此 </code> 可以使用。在其他情况下,对于固定数量的多个参数,您还可以使用 <code>
、</code> 等。对于可变数量的参数,“$@”会更合适。</p>
<h3>Shell 脚本 (myshell.sh)</h3>
<pre><code>#!/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=
...
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
您只需要决定要处理什么条件以及如何处理它们。我已经列出了所有似乎涉及超时的。