시스템이 스크립트 내의 스크립트가 백그라운드 프로세스를 완료할 때까지 기다리게 하는 방법

시스템이 스크립트 내의 스크립트가 백그라운드 프로세스를 완료할 때까지 기다리게 하는 방법

데이터 세트에 대한 파이프라인을 구축 중입니다. 주요 부분은 다음과 같습니다.

#! /bin/bash

time bwa mem -o bwa/mem/Stettler -M -t 96 -R "@RG\tID:Test\tSM:Stettler\tLB:TestLib\tPL:ILLUMINA" /storage/ppl/wentao/bwa_Index/genome.fa $1 $2
wait
echo "finished mem"
samtools view -Sb -@ 96 -o samtools/Stettler.bam bwa/mem/Stettler
wait
echo  "got stettler"
wait
time samtools sort -@ 96 -O bam -o samtools/sort/approachAsortedstettler.bam samtools/Stettler.bam
wait
echo "sorted"

time samtools index samtools/sort/approachAsortedstettler.bam
wait
echo "finished indexing"

time gatk MarkDuplicates -I samtools/sort/approachAsortedstettler.bam -O GATK/MarkDuplicates/ApproachAsortedstettler.bam -M GATK/MarkDuplicates/metrics/ApproachB
wait
echo "Marked Duplicates"
time samtools index GATK/MarkDuplicates/ApproachAsortedstettler.bam
wait
echo "indexed again ++++++++++++++++++++++++++++++++++++++++"
time bash scripts/Parallelhaplo.sh
wait
echo "Parallelhaplo"

time bash scripts/MergerHAplo.sh
wait
echo "merged"
time vcftools --vcf GATK/MergedSample_gather.raw.vcf --min-meanDP  $3 --recode --out vcftools/MergedGATKdp2.vcf
wait
echo "deep checked"
time gatk IndexFeatureFile --feature-file vcftools/MergedGATKdp2.vcf.recode.vcf
wait
echo "IFF"
time gatk SelectVariants -R /storage/ppl/wentao/GATK_R_index/genome.fa --variant vcftools/MergedGATKdp2.vcf.recode.vcf --concordance vcftools/Mergedmpileupdp2.vcf.recode.vcf -O GATK/SelectVariants/Common$
wait
echo "finished"

병렬 Haplo라는 프로세스는 다음과 같습니다.

#!/bin/bash
#parallel call SNPs with chromosomes by GATK

for i in 1 2 3 4 5 6 7;do for o in A B D;do for u in _part1 _part2;do (gatk
 HaplotypeCaller -R /storage/ppl/wentao/GATK_R_index/genome.fa -I 
GATK/MarkDuplicates/ApproachAsortedstettler.bam -L chr$i$o$u -O 
GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf &);done;done ; done 

gatk HaplotypeCaller -R /storage/ppl/wentao/GATK_R_index/genome.fa -I 
GATK/MarkDuplicates/ApproachBsortedstettler.bam -L chrUn -O 
GATK/HaplotypeCaller/HaploSample.chrUn.raw.vcf&

wait

echo "parallel call finished"

wait

그런데 스크립트를 실행하면 보통 ParallelHaplo가 시작되는데 무슨 이유에서인지 양쪽 스크립트의 대기가 완료될 때까지 기다리지 않아서 다음 단계로 넘어가는데 다음 One 단계로 인해 실행이 되지 않습니다. 파일을 찾으세요. 오류가 발생합니다. 그래서 내가 무엇을 할 수 있니?

답변1

문제는 gatk 프로세스를 서브쉘 내부의 백그라운드로 보내는 것입니다: ( gatk ... & ). 백그라운드 프로세스는 스크립트 셸이 아닌 이 하위 셸의 자식이 아니므로 wait이를 볼 수 없고 기다리지 않습니다. 에서 help wait:

wait: wait [-fn] [id ...]
    Wait for job completion and return exit status.

    Waits for each process identified by an ID, which may be a process ID or a
    job specification, and reports its termination status.  If ID is not
    given, waits for all currently active child processes, and the return
    status is zero.  If ID is a job specification, waits for all processes
    in that job's pipeline.

전체 서브셸의 컨텍스트로 변경하면(즉 ( gatk ... ) &, 여기서는 유용한 작업을 수행하지 않으므로 서브셸을 전혀 사용하지 않는 것이 좋습니다) 예상대로 작동합니다.

for i in 1 2 3 4 5 6 7; do
  for o in A B D; do
    for u in _part1 _part2; do
      gatk HaplotypeCaller \
           -R /storage/ppl/wentao/GATK_R_index/genome.fa \
           -I GATK/MarkDuplicates/ApproachAsortedstettler.bam \
           -L chr$i$o$u \
           -O GATK/HaplotypeCaller/HaploSample.chr$i$o$u.raw.vcf &
    done
  done
done 

관련 정보