我想通过
main.py
脚本使用不同参数多次运行Python脚本sbatch_run.sh
,如下所示:
#!/bin/bash
#SBATCH --job-name=sbatch_run
#SBATCH --array=1-1000
#SBATCH --exclude=node047
arg1=10 #arg to be change during runs
arg2=12 #arg to be change during runs
python main.py $arg1 $arg2
参数编码在 sbatch 运行的 bash 文件中。我担心如果我多次运行
sbatch_run.sh
一个接一个,但在每次运行期间更改 arg1 和 arg2 的值,可能会导致运行错误。例如,如果我这样做:
sbatch sbatch_run.sh # with arg1=10 and arg2=12
然后立即更改后
sbatch_run.sh
但再次运行文件,如下所示:
sbatch sbatch_run.sh # with arg1=69 and arg2=666
将我的运行全部与最后一次运行(即
arg1=69
和arg2=666
)而不是每次运行都有自己的参数。
我确信,如果我对 main.py 中的参数进行硬编码,然后运行相同的 sbatch 脚本但更改 main.py ,它将运行最后一个。我想知道如果我更改
sbatch_run.sh
脚本是否也会出现这种情况。
正如你所知,我确实尝试了这个实验,通过运行 1000 个脚本,然后一些脚本排队并放置睡眠命令,然后更改
sbatch_run.sh
。这似乎并没有改变我的跑步方式,但是,如果我错了,这太重要了,不能偶然出错,并且想确保我也问过。
为了记录我跑了:
#!/bin/bash
#SBATCH --job-name=ECHO
#SBATCH --array=1-1000
#SBATCH --exclude=node047
sleep 15
echo helloworld
echo 5
然后将 echo 更改为 echo 10 或 echo byebyeworld。
当sbatch运行时,Slurm将提交脚本复制到其内部数据库;你可以通过以下实验来说服自己:
$ cat submit.sh
#!/bin/bash
#SBATCH --hold
echo helloworld
--hold
的作用是确保作业不会开始。提交:
$ sbatch submit.sh
然后修改提交脚本:
$ sed -i 's/hello/bye/' submit.sh
$ cat submit.sh
#!/bin/bash
#SBATCH --hold
echo byeworld
现在使用
control show job
查看 Slurm 计划运行的脚本:
$ scontrol show -ddd job YOURJOBID
JobId=******* JobName=submit.sh
[...]
BatchScript=
#!/bin/bash
#SBATCH --hold
echo helloworld
[...]
虽然原脚本有改变,但它没有改变。
[编辑] Slurm 的最新版本使用
scontrol write batch_script <job_id> [<optional_filename>]
而不是 scontrol show -dd job
将提交脚本写入名为 <optional_filename>
的文件。可选文件名可以是 -
将脚本显示到屏幕上,而不是将其保存到文件中。