Slurm salloc分配节点后立即失败,sbatch正常的排查求助
问题背景
此前使用salloc分配计算节点一切正常,切换另一用户账号(仅conda路径变更,.bashrc配置相同)后salloc失效,切回原账号问题依旧,但sbatch批处理作业可正常运行。
现象
- slurm-gpu-avail显示资源充足,请求参数正常
- 执行命令:
salloc -J debug -p <partition> -t 0-6:00:00 --gres=gpu:4 --nodes=1 --qos=<qos-short>
- 终端输出:
salloc: [Warning] You can login compute nodes after the job is executed for at least 5min salloc: Pending job allocation <JOBID> salloc: job <JOBID> queued and waiting for resources
- 终端挂起后,
squeue --me无作业显示;scontrol show job <JOBID>显示作业已分配至节点(NodeList=r8a30-a07)但立即失败,Start与End时间相同,状态为FAILED,原因是NonZeroExitCode,ExitCode=1:0
已尝试操作
- 排查.bashrc和.bash_profile未发现异常
- 添加
--no-shell参数后问题依旧 - 在$HOME目录执行、切换QoS均无效
普通用户可执行的排查命令
- 查看作业详细错误日志
sacct -j <JOBID> --format=JobID,JobName,Partition,NodeList,State,ExitCode,Elapsed,Reason,STDERR
重点提取STDERR路径,查看作业启动阶段的具体错误输出。
- 精简参数并启用 verbose 模式
salloc -p <partition> -t 1:00 --nodes=1 --no-shell --verbose
通过精简参数排除冗余配置影响,用--verbose获取更详细的作业启动日志。
- 对比salloc与sbatch的环境变量差异
- 编写
test_env.sh脚本:
#!/bin/bash env > $HOME/sbatch_env.log
提交sbatch作业:sbatch -p <partition> -t 1:00 --nodes=1 test_env.sh
- 用salloc执行同样的环境变量导出:
salloc -p <partition> -t 1:00 --nodes=1 env > $HOME/salloc_env.log
对比两个日志文件,重点关注PATH、LD_LIBRARY_PATH、CONDA相关变量的差异。
- 检查计算节点上的用户权限与目录访问性
编写check_perm.sh脚本:
#!/bin/bash ls -ld $HOME id echo "Home directory access test: $(test -r $HOME && echo OK || echo FAILED)"
提交sbatch作业执行,确认用户在计算节点上的UID/GID正常,且能正常访问home目录。
- 测试salloc执行简单命令
salloc -p <partition> -t 1:00 --nodes=1 echo "test"
若能成功输出,说明问题出在shell启动环节;若失败,则指向作业启动流程的基础问题。
故障原因分析
环境变量初始化冲突
切换用户后conda路径变更,可能导致计算节点加载环境时触发错误(如conda初始化脚本执行失败)。sbatch默认可能跳过部分交互式shell配置,而salloc会完整加载用户shell的初始化脚本,导致错误触发作业退出。计算节点的目录权限/挂载问题
用户home目录在计算节点上可能出现NFS挂载异常或权限变更,salloc启动交互式shell时需要读取home目录下的配置文件,无法访问则直接退出;而sbatch作业若未依赖这些配置文件,可能不受影响。shell配置的交互式专属错误
用户.bashrc或.bash_profile中可能存在仅在交互式环境下执行的代码(如未通过[[ $- == *i* ]]判断是否为交互式shell),这些代码在salloc启动时执行报错,但sbatch的非交互式环境不会触发。ExitCode=1:0的指向
主进程退出码为1,说明作业启动时的初始进程(通常是用户shell)执行失败,可能是shell初始化报错、无法找到指定shell、权限不足等直接原因。
内容的提问来源于stack exchange,提问作者Calculus007

