Выполнение bash-скрипта с параллелью для многих каталогов - PullRequest
1 голос
/ 29 октября 2019

Если у меня есть скрипт bash (chunks.sh), который выполняет несколько мини-сценариев параллельно, мне было интересно, как правильно выполнить chunks.sh, чтобы он работал параллельно для многих папок? У меня около 1000 папок с файлами, которые нужно обработать. Вот мой сценарий:

#!/bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks=4
#SBATCH --time=16:00:00
#SBATCH --output=mpi_output_%j.txt
#SBATCH --mail-type=FAIL

cd $SLURM_SUBMIT_DIR

module load gcc
module load gnu-parallel
module load bwa
module load samtools

parallel -j 10 < ../1convertfiles.sh
parallel -j 10 < ../2sortfiles.sh
parallel -j 10 < ../3indexfiles.sh
parallel -j 10 < ../4converttopile.sh
parallel -j 10 < ../5createconsensus.sh
parallel -j 10 < ../6concatenateconsensus.sh

Каждая папка имеет имя, такое как THAKID0001_dir, THAKID0010_dir и т. Д. Поэтому мне было интересно, как правильно применить команду в этом сценарии для циклического просмотра моего текущего каталога, найти всекаталоги с присоединенным * _dir, а затем выполнить все эти мини-сценарии в этом каталоге?

Я пытался поместить свои параллельные команды в циклы for, но мини-сценарии повторялись много раз. Я думаю, что могу использовать:

parallel -j 10 < 1convertfiles.sh ::: *_dir/*  
parallel -j 10 < 2sortfiles.sh ::: *_dir/*
etc.

Но эта логика мне кажется, что каждый параллельный командный блок не будет работать для одного и того же каталога сразу. Каждая параллельная строка будет находить свой собственный каталог для работы, и эти мини-скрипты должны работать по порядку, поэтому я попытался написать цикл for, но это создавало огромный беспорядок.

Ожидаемые результаты:

 $ ./chunks.sh
 ### Should run the list of commands per folder ###
 ### For example, it will execute all the parallel commands in THAK0001_dir then it will execute all the parallel commands in THAK0002_dir, etc ####

TL; DR: Как заставить chunk.sh выполнить эти параллельные командные блоки для всех каталогов с определенным тегом (например, THAK * _dir), но каждая строка должна выполняться после завершения предыдущей строки. Надеюсь, что это имело смысл .. спасибо!

1 Ответ

1 голос
/ 29 октября 2019

На поверхности проблема требует вспомогательного сценария, который будет выполнять последовательную обработку:

process-dir.sh в $ SLURM_SUBMIT_DIR

#! /bin/bash
# Process all jobs for current folder, sequentially.
# Input: Folder, e.g. THAKID0001_dir
cd $1
../1convertfiles.sh
../2sortfiles.sh
../3indexfiles.sh
../4converttopile.sh
../5createconsensus.sh
../6concatenateconsensus.sh

И затем работать параллельно

#! /bin/bash
cd $SLURM_SUBMIT_DIR

module load gcc
module load gnu-parallel
module load bwa
module load samtools

parallel -j10 process-dir.sh ::: *_dir

Или избегайте файла process-dir.sh, включив непосредственно функцию bash:

#! /bin/bash
cd $SLURM_SUBMIT_DIR

module load gcc
module load gnu-parallel
module load bwa
module load samtools

process-dir() {
  # Process all jobs for current folder, sequentially.
  # Input: Folder, e.g. THAKID0001_dir
  cd "$1"
  ../1convertfiles.sh
  ../2sortfiles.sh
  ../3indexfiles.sh
  ../4converttopile.sh
  ../5createconsensus.sh
  ../6concatenateconsensus.sh
}
export -f process-dir

parallel -j10 process-dir ::: *_dir
...