Slurm脚本无法切换至父目录及输出权限报错的原因与解决
Slurm脚本切换工作目录失败及权限错误的解决方法
问题场景
运行Slurm脚本时,意图切换至脚本父目录,但执行后未达到预期,同时出现权限拒绝错误。脚本核心片段如下:
#!/bin/bash #SBATCH --job-name=INCAR #JobName ...(省略中间配置) module load intel/2020a module load impi/2019.7.217 module load vasp/6.3.0 vdir="$(dirname "$0")" echo "$vdir" cd "$vdir" export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so srun vasp_std > OUT 2> ERR
排查输出
echo "$vdir"返回:
/var/spool/slurmd/job7886257
错误信息
/var/spool/slurmd/job7886257/slurm_script: line 29: OUT: Permission denied
问题原因
$0指向临时副本:Slurm会将用户提交的脚本复制到/var/spool/slurmd/jobxxxxxx临时目录执行,因此$0指向的是该临时目录内的脚本副本,而非本地原脚本路径,导致dirname "$0"获取的是Slurm临时目录,而非目标父目录。- 临时目录无写入权限:
/var/spool/slurmd/下的任务目录由Slurm管理,普通用户仅拥有读取权限,无法创建OUT、ERR等输出文件,触发权限拒绝错误。
解决方案
方案1:利用Slurm内置环境变量切换到提交目录
Slurm自动设置SLURM_SUBMIT_DIR环境变量,其值为提交脚本时所在的工作目录,直接使用该变量切换即可:
# 替换原脚本中的vdir定义与cd命令 cd "$SLURM_SUBMIT_DIR"
方案2:获取原脚本的真实路径切换到父目录
若需切换到原脚本的父目录(而非提交目录),可通过以下方式获取原脚本真实路径:
# 通过Slurm任务信息获取原脚本路径 real_script=$(scontrol show job $SLURM_JOBID | grep -oP 'Command=\K.*') vdir=$(dirname "$real_script") cd "$vdir"
或提交脚本时使用绝对路径,再在脚本中解析真实路径:
# 提交命令示例 sbatch /home/yourname/scripts/vasp_job.sh # 脚本内获取真实路径 vdir=$(dirname "$(readlink -f "$0")") cd "$vdir"
注:部分系统需用realpath替代readlink -f
关键注意事项
确保最终切换到的目录拥有读写权限,避免再次触发权限拒绝错误。
内容的提问来源于stack exchange,提问作者蕭力諶
相关产品推荐
相关产品推荐

