在Niagara的Slurm调度器中用mpirun执行脚本遇权限拒绝错误求助
在Niagara(Slurm调度器)的debug队列提交作业时遇到如下权限错误:
SALLOC: error: _fork_command: Unable to exec command "/mypath/test.sh": Permission denied
已确认test.sh具备可读权限,串行运行该脚本完全正常,但使用mpirun启动并行作业时就会触发上述错误。
提交作业用的test.sh脚本内容如下:
#!/bin/bash #SBATCH --account= xxxx #SBATCH --nodes=2 #SBATCH --ntasks=160 #SBATCH --time=3:30:00 #SBATCH --job-name "sNucRNASeq" pushd /mypath/ mpirun --np 4 R --no-save < Rscript test.R Rscript test.R
尝试过执行chmod -rwx test.sh但没有效果,怀疑是多处理器访问文件的权限设置有遗漏,寻求解决方法。
配套的test.R脚本内容:
library(pbdMPI) init() rank<-comm.rank() size<-comm.size() myfiles<-load("ListofFiles.RData") y <- scatter(lapply(myfiles, readRDS)) comm.print(str(y)) finalize()
修正权限操作错误:你执行的
chmod -rwx test.sh是移除脚本的读写执行权限,完全搞反了!正确操作是给脚本添加可执行权限:chmod +x /mypath/test.sh同时要确保脚本所在的目录
/mypath/对所有计算节点的用户有执行权限(目录的执行权限允许进入目录访问内部文件):chmod +x /mypath/修复Slurm脚本语法问题:你的SBATCH参数
--job-name缺少等号,正确写法应为:#SBATCH --job-name="sNucRNASeq"语法问题可能引发Slurm处理异常,建议及时修正。
调整MPI任务启动方式:在Niagara的Slurm环境中,推荐用
srun替代mpirun来启动MPI任务,它能更好地和调度器集成,避免节点间的权限或资源匹配问题。同时你脚本里的R --no-save < Rscript test.R写法有误,正确的并行调用可以改成:srun --ntasks=4 Rscript test.R确认数据文件跨节点访问权限:确保
ListofFiles.RData以及它引用的所有.RDS文件所在的目录,对所有计算节点的用户都有读权限——并行任务的所有进程都需要能访问这些文件。排查共享存储ACL设置(可选):如果上述方法无效,可能是共享存储的访问控制列表(ACL)限制了权限。先查看目录的ACL设置:
getfacl /mypath/如果发现计算节点用户缺少权限,用
setfacl添加(替换compute_users为集群实际的计算节点用户组):setfacl -m g:compute_users:rx /mypath/
内容的提问来源于stack exchange,提问作者mahnoorh

