【问题标题】:How do I use parallel programming/multi threading in my bash script?如何在我的 bash 脚本中使用并行编程/多线程?
【发布时间】:2013-08-22 15:17:10
【问题描述】:

这是我的脚本:

#!/bin/bash
#script to loop through directories to merge fastq files
sourcedir=/path/to/source
destdir=/path/to/dest

for f in $sourcedir/*
do
    fbase=$(basename "$f")
    echo "Inside $fbase"
    zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz
    zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz
done

这里有大约 30 个子目录在目录 'source' 中。每个子目录都有某些 R1.fastq.gz 文件和 R2.fastq.gz 我想合并成一个 R1.fastq.gz 和 R2.fastq.gz文件,然后将合并的文件保存到目标目录。我的代码运行良好,但由于数据量大,我需要加快速度。我只想知道有什么方法可以在我的脚本中实现多线程编程吗?如何运行我的脚本以使多个作业并行运行? bash 脚本的新手,因此我们将不胜感激。

【问题讨论】:

标签: multithreading bash parallel-processing fastq


【解决方案1】:

最简单的方法是在后台执行命令,在命令末尾添加&

#!/bin/bash
#script to loop through directories to merge fastq files
sourcedir=/path/to/source
destdir=/path/to/dest

for f in $sourcedir/*
do
    fbase=$(basename "$f")
    echo "Inside $fbase"
    zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz &
    zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz &
done

来自bash manual

如果命令被控制运算符“&”终止,shell 会在子 shell 中异步执行命令。这称为在后台执行命令。 shell 不等待命令完成,返回状态为 0(真)。当作业控制未激活时(请参阅作业控制),异步命令的标准输入,在没有任何显式重定向的情况下,从 /dev/null 重定向。

【讨论】:

  • 我实际上指的是有关此问题的其他 stackoverflow 问题,他们提到了诸如 pid 和 wait 之类的东西。那么在命令末尾添加 & 是一种并行化作业的有效方法吗?
  • @user2703967 是的...添加& 会生成一个新的子shell,它会消失并在您的脚本继续执行时执行其操作。如果你需要比这更复杂的东西,你可能一开始就不应该使用 bash。
  • 谢谢,最后一个问题。当我在“完成”之后使用“等待”时,它有什么区别?
  • @user2703967 让您的操作系统处理它(它会)。除非您正在做的事情过于复杂,甚至无法考虑在 bash 中做,否则这真的不是问题。
  • 老兄,这真是天才。如此明显!哇。非常感谢。
【解决方案2】:

我不确定,但您可以尝试在这样的命令末尾使用&

zcat $f/*R1*.fastq.gz | gzip > $destdir/"$fbase"_R1.fastq.gz &
zcat $f/*R2*.fastq.gz | gzip > $destdir/"$fbase"_R2.fastq.gz &

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2011-09-29
    相关资源
    最近更新 更多