Slurm调度场景下sbatch脚本内srun命令被忽略的原因咨询
问题核心成因
- 主脚本未等待后台任务执行就提前退出:循环中所有srun命令都通过
&放入后台运行,脚本执行完循环后没有调用wait命令等待子进程结束,主进程运行到脚本末尾直接退出。Slurm会在作业主进程终止时,立刻回收该作业分配到的全部资源、杀死所有关联子进程,4个plink任务刚被拉起就被终止,自然没有业务输出。 - srun参数存在资源竞争冲突:SBATCH头为整个作业申请了4个任务槽,但是每个srun都携带
--exclusive参数,该参数在作业内部生效时会要求srun独占分配给作业的全部可用资源,4个同时启动的srun会互相等待对方释放资源,全部处于阻塞挂起状态,根本无法启动plink进程。 - 输出与错误日志未分离:默认配置下Slurm会把作业的标准输出、标准错误都写到同一个
slurm-作业号.out文件中,如果srun启动失败、plink运行报错,错误信息可能因为缓冲、进程被强杀等原因没有及时刷入日志文件,导致只能看到echo输出的4行启动提示。
可直接使用的修复脚本
#!/usr/bin/env bash #SBATCH --job-name=parallel-plink #SBATCH --mem=400GB #SBATCH --ntasks=4 #SBATCH --cpus-per-task=1 #SBATCH --output=slurm-%j.out #SBATCH --error=slurm-%j.err cd ~/RS1 for n in {1..4}; do echo "Starting ${n}" # 移除--exclusive参数避免作业内部资源竞争,预留少量内存避免触发OOM srun --input none --ntasks=1 -c 1 --mem-per-cpu=100G \ plink --memory 95000 --bfile RS1 --distance triangle bin \ --parallel ${n} 4 --out dt-output & done # 阻塞等待所有后台srun任务执行完成后再退出主脚本 wait
补充排查手段
如果修改后任务仍异常,可以通过以下方式定位问题:
- 执行
sacct -j <你的作业号> --format=JobID,JobName,State,ExitCode,MaxRSS查看每个srun子任务的运行状态、退出码、实际内存使用,确认是启动失败、被OOM杀死还是正常退出。 - 临时把srun替换为直接执行plink命令(保留&和wait),确认并行逻辑本身在Slurm作业环境内可正常运行。
- 检查Slurm节点的cgroup配置,确认内存、CPU核数限制规则正确,没有出现资源分配值和实际cgroup限制值不匹配的问题。
内容的提问来源于stack exchange,提问作者mve
相关产品推荐
相关产品推荐

