Вы перезагружаете свою систему каждый раз, когда переключаетесь между дистрибутивами Linux -, так почему бы не использовать диспетчер загрузки прошивки, чтобы делать то, что вы хотите.
parallel echo HaploSample.chr{1}{2}{3}.raw.vcf ::: 1 2 3 4 5 6 7 ::: A B D ::: _part1 _part2
У меня нет parallel
, и я не очень понимаю, что делает ваш скрипт, поэтому я не могу проверить это. Но я верю, что это сработает, и может быть в стиле, который вы искали.
Перепишите скрипт, чтобы убрать циклы и принять аргументы :
#!/bin/bash
#parallel call SNPs with chromosomes by GATK
(to be safe, verify that "$#" is 3)
i="$1"
o="$2"
u="$3"
(if you want, verify that the arguments are valid)
gatk HaplotypeCaller \
︙ \
-L "chr$i$o$u" \
-O "GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf" &
gatk HaplotypeCaller \
︙ \
-L chrUn -O GATK/HaplotypeCaller/HaploSample.chrUn.raw.vcf &
Затем запустите его следующим образом :printf '%s\n' {1,2,3,4,5,6,7}' '{A,B,D}' '_part{1,2} | parallel -L1 (your_script)
Позвольте мне провести вас через это :{1,2,3}
расширяется до трех слов :1
, 2
и 3
. {1,2,3} {A,B}
расширяется до пяти слов :1
, 2
, 3
, A
и B
. {1,2,3}{A,B}
расширяется до шести слов :1A
, 1B
, 2A
, 2B
, 3A
и 3B
. {1,2,3}' '{A,B}
расширяется до шести слов :1 A
, 1 B
, 2 A
, 2 B
, 3 A
и 3 B
. Обратите внимание, что эти «слова» содержат пробелы. {1,2,3,4,5,6,7}' '{A,B,D}' '_part{1,2}
расширяется до 42 (7×3×2 )слов, каждый из которых включает два пробела. printf '%s\n'
выводит каждое «слово» на отдельной строке. Но помните, мы говорим о «словах» с пробелами в них. В результате он печатает два или три обычных (не -пробела )слов в строке. Например, $ printf '%s\n' {1,2,3}' '{A,B}
1 A
1 B
2 A
2 B
3 A
3 B
На данный момент это обычные пространства; они больше не котируются. -L1
указывает parallel
запустить вашу программу с данными из одной строки. Он разорвет линию на пробелы, и получить набор из трех аргументов. В первом приближении распараллеливание имеет смысл, когда количество заданий <= количеству ядер. У вас есть 42 ядра? Если нет, то распараллеливание всех заданий одновременно может не иметь смысла.
Вот «наивный» способ параллельной работы:
1 )Не выполняйте команды, а ЗАПИСЫВАЙТЕ их:
for i in 1 2 3 4 5 6 7
do
for o in A B D
do
for u in _part1 _part2
do
echo "gatk HaplotypeCaller \
-R /storage/ppl/wentao/GATK_R_index/genome.fa \
-I GATK/MarkDuplicates/ApproachBsortedstettler.bam \
-L chr$i$o$u \
-O GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf &"
done
done > file-$i.sh
done
Теперь у вас есть 7 текстовых файлов по 6 команд в каждом. Вы можете выполнять параллельные задания партиями по 6, запуская эти 7 сценариев один за другим. Если у вас достаточно ядер (16? ), вы можете запускать одновременно две партии по 6 штук.
Вспенить, смыть, повторить.