首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让系统等待脚本中的脚本完成其后台进程?

如何让系统等待脚本中的脚本完成其后台进程?
EN

Unix & Linux用户
提问于 2019-07-04 17:41:02
回答 1查看 73关注 0票数 1

我正在为一组数据构建管道,我的主要部分是这样的

代码语言:javascript
复制
#! /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的过程如下所示

代码语言:javascript
复制
#!/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,但是由于某种原因,对这两个脚本中的任何一个的等待都不会等待它完成,所以会转到下一个步骤,并且由于下一步找不到文件,所以我只得到了错误。那我能做什么呢?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-07-04 17:57:30

问题是,您要将gatk进程发送到子subshell:( gatk ... & )中的后台。后台进程是该子shell的noa子进程,而不是脚本的shell,因此wait不会看到它,也不会等待它。来自help wait

代码语言:javascript
复制
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.

如果您将其更改为整个子subshell的背景(即( gatk ... ) &,或者更好的是根本不使用子subshell,因为它在这里没有做任何有用的事情),它将按预期工作:

代码语言:javascript
复制
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 
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/528431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档