Slurm脚本执行报错:文件未找到与Go绝对路径导入异常
问题分析与修复方案
1. "文件未找到"错误解决
错误输出显示/inmap_sandbox/setup.sh不存在,核心原因是$SCRATCH环境变量在Slurm计算节点的运行环境中未被正确加载,导致DATADIR=${SCRATCH}/inmap_sandbox被解析为/inmap_sandbox,而非预期的/scratch/inmap_sandbox。
修复步骤:
直接将DATADIR定义为绝对路径,避免依赖未加载的环境变量:
DATADIR=/scratch/inmap_sandbox
如果集群要求必须使用SCRATCH变量,可在脚本开头显式导出:
export SCRATCH=/scratch DATADIR=${SCRATCH}/inmap_sandbox
2. Go环境"cannot import absolute path"错误解决
go run $DATADIR/的用法存在两个问题:
go run命令需要指定具体的Go源文件(如main.go),而非直接指向目录- Go不支持直接导入绝对路径,需通过Go模块或GOPATH规范解决
修复方法(推荐使用Go模块):
- 提前在本地或计算节点上初始化Go模块:
cd /scratch/inmap_sandbox go mod init inmap_sandbox
- 修改Slurm脚本中的
go run命令:
cd $DATADIR go run main.go # 替换为你的实际主程序文件名
备选方案(使用GOPATH):
如果不使用Go模块,需将项目目录放入GOPATH规范路径下:
export GOPATH=/scratch go run $GOPATH/src/inmap_sandbox/main.go
完整修复后的Slurm脚本示例
#!/bin/bash #SBATCH --partition production #SBATCH --nodes=1 #SBATCH --ntasks-per-node=1 #SBATCH --cpus-per-task=1 #SBATCH --time=5:00:00 #SBATCH --mem=2GB #SBATCH --job-name=myTest #SBATCH --mail-type=END #SBATCH --mail-user=atd341@nyu.edu #SBATCH --output=slurm_%j.out module purge module load go/1.17 # 显式定义绝对路径 DATADIR=/scratch/inmap_sandbox cd $SLURM_WORK_DIR # 加载setup.sh source $DATADIR/setup.sh # 进入项目目录运行Go程序 cd $DATADIR go run main.go
额外检查项
- 确认
/scratch/inmap_sandbox/setup.sh存在,且执行权限正常(可运行chmod +x /scratch/inmap_sandbox/setup.sh添加权限) - 验证计算节点是否能正常访问
/scratch共享存储目录 - 确保Go模块初始化后,
go.mod文件存在于/scratch/inmap_sandbox目录下
内容的提问来源于stack exchange,提问作者Amu
相关产品推荐
相关产品推荐

