切换git分支提交SLURM作业的代码版本隔离问题
SLURM作业与Git分支绑定问题说明
问题背景
- 维护的Git代码仓库包含两个分支:
branch1、branch2 - 原有工作流:在计算集群终端执行
sbatch shell_script.sh提交SLURM作业,运行存放在branch1下的Julia脚本my_code.jl - 核心需求:修改
my_code.jl时不影响已经提交的作业,保证这类已提交作业始终运行旧版本代码,因此新建branch2存放新的代码修复内容
初始疑问
- 切换到
branch2分支后,使用和branch1完全一致的sbatch shell_script.sh命令提交新作业,是否会自动运行branch2版本的my_code.jl? - 切换分支前已经提交的旧作业,是否会继续运行
branch1版本的my_code.jl? - 如果上述猜想成立,
shell_script.sh中执行代码的命令仅为julia my_code.jl,没有携带任何Git分支信息,SLURM是如何识别对应代码分支版本的?
实测结论
快速测试验证初始猜想不成立:在旧分支提交作业后,切换到新分支再次提交相同作业,最终两个作业都运行了新分支上的代码,无法直接在新分支上安全开发的同时,保证此前提交的SLURM作业不受代码变更影响。
原因说明
SLURM本身完全不感知Git的分支逻辑,出现上述测试结果是默认机制下的必然现象:
- 执行
sbatch命令提交作业时,SLURM默认只会将**提交时刻的作业脚本本身(即shell_script.sh)**复制到自身的调度存储区,不会同步备份脚本中引用的其他外部文件(包括my_code.jl) - 作业真正获得资源开始运行时,会默认进入提交
sbatch命令时所在的工作目录,直接读取该路径下实时存在的my_code.jl文件。如果作业排队等待调度的时间段内,你切换了Git分支、修改了目录下的代码文件,作业启动时读取到的就是修改后的新版本,和提交作业时所在的Git分支没有任何绑定关系。
可行解决方案
要保证已提交作业始终运行提交时刻的代码版本,可选择以下任意一种实现方式:
- 每次提交作业前,将当前版本的代码完整拷贝到一个独立的、后续不会做任何修改的目录下,修改作业脚本中的路径指向这个独立目录的代码文件后再提交
- 在提交的
shell_script.sh开头显式写死版本固定逻辑,比如先执行git checkout <提交时刻对应的完整commit hash>(注意不要写分支名,分支对应的提交会随更新变动),再执行julia my_code.jl - 提交作业时添加
--chdir参数,指定一个提交时刻就固定好的、存放对应版本代码的不可变工作目录,避免后续分支切换、代码修改影响作业运行时读取的文件内容
内容的提问来源于stack exchange,提问作者phyphy
相关产品推荐
相关产品推荐

