我正在bash中的文件列表上运行计算量大的程序。如果一次执行一次,则不会使用我的计算机功能,但是,如果我在命令后附加&
符号以在后台进程中运行它们,则表示我运行的太多了。我正在寻找一种指定我希望n
进程通过项文件的特定列表进行工作的方法。当一个完成时,它继续前进到另一个。
作为一个最小的示例,下面是一些设置代码来复制我的情况:
$ mkdir test
$ cd test
$for i in {1..1000}
>do
> echo "$i" >> $i.txt
> done
我将如何使用(例如)2个过程来仅处理此文件列表,以便每个文件中的输出对数字$i
(可能加两个或类似的东西)进行任意操作,然后打印{ {1}},具体取决于操作1还是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
间接访问。