You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者蕭力諶

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:30:25