Bash 如何使用SLURM处理文件列表

Bash 如何使用SLURM处理文件列表,bash,parallel-processing,slurm,Bash,Parallel Processing,Slurm,我不太会说脏话。我想并行处理文件列表assembled\u reads/*.sorted.bam。然而,对于下面的代码,只有一个进程被反复使用 #!/bin/bash # #SBATCH --job-name=**** #SBATCH --ntasks=1 #SBATCH --cpus-per-task=24 #SBATCH --partition=short #SBATCH --time=12:00:00 #SBATCH --array=1-100 #SBATCH --mem-per-cpu=

我不太会说脏话。我想并行处理文件列表
assembled\u reads/*.sorted.bam
。然而,对于下面的代码,只有一个进程被反复使用

#!/bin/bash
#
#SBATCH --job-name=****
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=24
#SBATCH --partition=short
#SBATCH --time=12:00:00
#SBATCH --array=1-100
#SBATCH --mem-per-cpu=16000
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=****@***.edu
srun hostname

for FILE in assembled_reads/*.sorted.bam; do
  echo ${FILE}
  OUTFILE=$(basename ${FILE} .sorted.bam).raw.snps.indels.g.vcf
  PLDY=$(awk -F "," '$1=="$FILE"{print $4}' metadata.csv)
  PLDYNUM=$( [[$PLDY = "haploid" ]] && echo "1" || echo "2")

  srun java -Djava.io.tmpdir="tmp" -jar GenomeAnalysisTK.jar \
  -R scaffs_HAPSgracilaria92_50REF.fasta \
  -T HaplotypeCaller \
  -I ${${SLURM_ARRAY_TASK_ID}} \
  --emitRefConfidence GVCF \
  -ploidy $PLDYNUM \
  -nt 1 \
  -nct 24 \
  -o $OUTFILE
  sleep 1 # pause to be kind to the scheduler
done

您正在创建作业数组,但未使用它。应使用基于slurm作业数组id的文件索引替换for循环:

#!/bin/bash
#
#SBATCH --job-name=****
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=24
#SBATCH --partition=short
#SBATCH --time=12:00:00
#SBATCH --array=1-100
#SBATCH --mem-per-cpu=16000
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=****@***.edu
srun hostname
FILES=(assembled_reads/*.sorted.bam)    
FILE=${FILES[$SLURM_TASK_ARRAY_ID]}

echo ${FILE}
OUTFILE=$(basename ${FILE} .sorted.bam).raw.snps.indels.g.vcf
PLDY=$(awk -F "," '$1=="$FILE"{print $4}' metadata.csv)
PLDYNUM=$( [[$PLDY = "haploid" ]] && echo "1" || echo "2")

srun java -Djava.io.tmpdir="tmp" -jar GenomeAnalysisTK.jar \
  -R scaffs_HAPSgracilaria92_50REF.fasta \
  -T HaplotypeCaller \
  -I ${${SLURM_ARRAY_TASK_ID}} \
  --emitRefConfidence GVCF \
  -ploidy $PLDYNUM \
  -nt 1 \
  -nct 24 \
  -o $OUTFILE

只需确保将
--array
的值调整为与要处理的文件数相等。

对上述答案稍加更正,正确的变量名是
$SLURM\u array\u TASK\u ID
() 这将基于阵列任务ID创建一个唯一的文件:

FILES=(assembled_reads/*.sorted.bam)    
FILE=${FILES[$SLURM_ARRAY_TASK_ID]}

见下面damienfrancois的回答。您可能会使用确定文件数的包装器脚本,然后使用
--array
参数提交其答案中显示的脚本,以指定包装器脚本中确定的文件数。您应该使用可以提交到SLURM的工作流管理器。我推荐你。斯劳姆博士和。如果您试图单独使用SLURM执行此操作,您的分析管道将很快变得过于复杂而无法管理,并且/或者您将破坏集群上的性能。此外,快速谷歌搜索将显示运行GATK的Nextflow管道示例,有些管道甚至可能已经带有基本的SLURM配置。其中一些被列为Wow。我记得有几次使用LSF作业数组,并且必须在文件名中包含连续的数字。这是更灵活的!在每次迭代中,同一个文件作为输入传递给。我花了几天的时间来完成这项工作,因为我反应这么晚