如何在bash shell中同时运行多个作业

时间:2014-09-17 02:22:27

标签: multithreading bash shell

我想在多个ID上多次运行相同的bash脚本。

这是我正在谈论的剧本:

#!/bin/bash
export PATH=/diag/software/bin:$PATH
cd /diag/cloud/udevisetty/RIL_stuff/Block_01
fq_dir="/diag/cloud/udevisetty/RIL_stuff/Block_01"
map_dir="/diag/cloud/udevisetty/RIL_stuff/mapping/"

for RIL in $(cat /diag/cloud/udevisetty/RIL_stuff/Block_01/test.txt); do
      for lane in 01; do
            perl /diag/cloud/udevisetty/RIL_stuff/Block_01/bwa_tophat_final.pl \
            --threads 12 \
            --out $map_dir/$RIL.$lane \
            --bwa_n 0.04 \
            --bwa_db /diag/home/udevisetty/db/Brapa_sequence_v1.5.fa \
            --fq $fq_dir/$RIL/*fq \
            --fq_id $RIL.$lane \
            --bowtie_db /diag/home/udevisetty/db/Brapa_sequence_v1.5.fa \
            --ref_fa /diag/home/udevisetty/db/Brapa_sequence_v1.5.fa \
            --ref_id Brapa_v1.5 \
            > $map_dir/$RIL.$lane.bwa_tophat.log \
            2> $map_dir/$RIL.$lane.bwa_tophat.err
done;
done

我的测试文件包含以下ID

RIL_251
RIL_21
RIL_211
RIL_136
RIL_66
RIL_155

但是现在它所做的只是遍历test.txt文件中的每个ID(因为它是'for'循环),然后一次执行一个脚本。但是我想在12个线程上同时运行所有ID。如何修改我的脚本来做到这一点?

2 个答案:

答案 0 :(得分:0)

一个人为的例子说明了如何用'xargs'来做到这一点:

root# cat id.txt | xargs -n 1 -P 3 ./script.sh
id2
id1
id4
id3
id5
id7
id6

id.txt的内容,请注意它的订购。

root# cat id.txt
id1
id2
id3
id4
id5
id6
id7

脚本内容:

root# cat script.sh
#!/bin/bash
echo $1

如果可用here

,您还可以使用GNU Parallel

答案 1 :(得分:0)

总结:

while read -u 3 -r line; do
  process "$line" &
done 3< input.txt

这遵循BashFAQ #001最佳实践方法从文件中读取行(使用FD 3避免重新分配stdin的描述符),并使用&运算符来处理每个进程。