如何将循环脚本转换为LSF集群的Job-array并批量并行执行
LSF Job Array 改造方案
改造后的完整脚本
#BSUB -J ExampleJobArray[1-100]%10 # 定义任务数组:100个任务,同时运行10个 #BSUB -L /bin/bash # 使用bash登录shell初始化环境 #BSUB -W 2:00 # 任务最长运行时间2小时 #BSUB -n 1 # 每个任务请求1核 #BSUB -R "span[ptile=1]" # 每个节点只分配1核 #BSUB -R "rusage[mem=5000]" # 每个任务请求5000MB内存 #BSUB -M 5000 # 每个任务的内存上限5000MB #BSUB -o Example1Out.%I # 输出文件用数组索引命名(比如Example1Out.1、Example1Out.2) # 把所有bam文件存入bash数组 bam_files=(*.bam) # 根据LSF数组索引获取当前任务要处理的文件(注意LSB_JOBINDEX从1开始,bash数组从0开始,所以要减1) current_bam=${bam_files[$((LSB_JOBINDEX-1))]} # 执行samtools coverage命令 samtools coverage ${current_bam} -o ${current_bam}_coverage.txt
关键修改说明
- 任务数组定义:把原脚本的
#BSUB -J ExampleJob1改成#BSUB -J ExampleJobArray[1-100]%10,其中[1-100]对应100个文件的任务数量,%10强制LSF同时最多运行10个任务,避免占用过多集群资源。 - 输出文件区分:把
#BSUB -o Example1Out.%J改成#BSUB -o Example1Out.%I,%I会替换成当前数组任务的索引编号(1到100),每个任务的输出文件独立,不会互相覆盖。 - 单任务处理逻辑:去掉原脚本的循环,改用bash数组存储所有bam文件,通过LSF提供的环境变量
LSB_JOBINDEX定位到当前任务要处理的单个文件,每个数组任务只处理一个bam文件,实现并行执行。
提交与管理命令
- 提交任务:
bsub < your_script.sh(将脚本保存为文件,比如run_coverage.sh,执行此命令提交) - 查看所有数组任务状态:
bjobs -a - 停止某个范围的数组任务:
bkill ExampleJobArray[1-20](停止索引1到20的任务) - 停止整个任务数组:
bkill ExampleJobArray
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

