如何在无Slurm的Linux服务器提交类似Slurm的批量作业?
无Slurm的Linux服务器批量作业提交方案
此前使用配备Slurm的服务器时,提交的批量作业脚本如下:
#!/bin/bash #SBATCH --job-name=sdmodel #SBATCH --output=logs/out/%a #SBATCH --error=logs/err/%a #SBATCH --nodes=1 #SBATCH --partition=common,scavenger #SBATCH -c 10 #SBATCH --mem-per-cpu=12GB #SBATCH --array=1-236 module load Matlab/R2021a matlab -nodisplay -r "run('main.m'); exit"现更换为未安装Slurm的纯Linux服务器,
sbatch命令无法使用,请问是否存在类似的批量作业提交方式?
1. 基础循环+后台运行
这是最易实现的替代方案,用bash循环遍历任务ID,把每个任务放到后台执行,同时复刻原脚本的日志和资源限制逻辑:
首先提前创建日志目录:
mkdir -p logs/out logs/err
然后编写批量执行脚本:
#!/bin/bash # 遍历1到236的任务ID for task_id in {1..236}; do # 用子shell封装单个任务,后台执行 ( # 限制任务使用10个CPU核心(对应原脚本的-c 10) taskset -c 0-9 # 限制单任务内存为12GB(对应原脚本的--mem-per-cpu=12GB) ulimit -v $((12 * 1024 * 1024)) # 加载Matlab模块(如果服务器没有module环境,直接写Matlab的绝对路径即可) module load Matlab/R2021a && \ matlab -nodisplay -r "run('main.m'); exit" ) > logs/out/${task_id} 2> logs/err/${task_id} & # 可选:控制并发数,比如每启动5个任务就等待一批完成,避免资源耗尽 if (( task_id % 5 == 0 )); then wait fi done # 等待所有后台任务执行完毕 wait
2. GNU Parallel(高效批量管理)
如果服务器安装了GNU Parallel,用它来管理批量任务会更省心,支持并发控制、资源限制,语法更简洁:
# 先创建日志目录 mkdir -p logs/out logs/err # 批量执行1-236号任务,设置并发数为5(可根据服务器配置调整) parallel --jobs 5 \ "taskset -c 0-9 && ulimit -v $((12 * 1024 * 1024)) && module load Matlab/R2021a && matlab -nodisplay -r 'run(''main.m''); exit'" \ > logs/out/{1} 2> logs/err/{1} ::: {1..236}
3. 注意事项
- 如果服务器没有
module命令,直接替换成Matlab的绝对路径,比如/usr/local/matlab/R2021a/bin/matlab; taskset的核心范围(0-9)可以根据服务器实际CPU数量调整,比如服务器有20核心,可分配不同任务用不同核心段;- 并发数不要设置过高,避免CPU、内存被占满导致系统卡顿。
内容的提问来源于stack exchange,提问作者phdstudent
相关产品推荐
相关产品推荐

