如何使用预定义数量的进程通过bash中的程序处理多个文件?

时间:2019-06-21 09:56:31

标签: bash parallel-processing

我正在bash中的文件列表上运行计算量大的程序。如果一次执行一次,则不会使用我的计算机功能,但是,如果我在命令后附加&符号以在后台进程中运行它们,则表示我运行的太多了。我正在寻找一种指定我希望n进程通过项文件的特定列表进行工作的方法。当一个完成时,它继续前进到另一个。

作为一个最小的示例,下面是一些设置代码来复制我的情况:

$ mkdir test
$ cd test

$for i in {1..1000}
>do
>   echo "$i" >> $i.txt
> done

我将如何使用(例如)2个过程来仅处理此文件列表,以便每个文件中的输出对数字$i(可能加两个或类似的东西)进行任意操作,然后打印{ {1}},具体取决于操作1还是2?

2 个答案:

答案 0 :(得分:2)

您的示例不太明智,因此很难更好地建议您,但是您可以为此使用 GNU Parallel

假设您要使用两个CPU内核以HeavyProcessing开头的所有文件上运行SeriousData

parallel -j 2 HeavyProcessing ::: SeriousData*

稍有不同的示例,例如,您要处理的文件名位于名为FileList.txt的文件中,并且您要为CPU所拥有的每个内核运行一个进程并获得进度条:

parallel -a FileList.txt --bar HeavyProcessing

答案 1 :(得分:1)

一个解决方案可能是xargs -P,但是它需要一些额外的噪音才能使其正常工作。这是一个映射到您的示例的解决方案:

printf '%s\0' {1..1000} | xargs -0 -rn1 -P2 bash -c 'echo "$1" >> "$1".txt' --

说明:

  • -0:位于\0字节的单独输入参数(因为这就是printf '%s\0' …发送的内容)
  • -r:如果没有输入,则什么也不做
  • -n1:每个进程仅使用一个输入参数
  • -P2:最多使用2个并行进程
  • bash -c '…' --:要运行的程序;从xargs运行外壳程序需要--来正确绑定位置参数
  • 'echo "$1" >> "$1".txt':实际的外壳程序代码

如果您要运行的批量代码不需要特殊的外壳功能(如重定向),则最后一部分会容易得多。您可以从xargs显式运行程序,而无需使用bash -c间接访问。