如何并行运行命令列表?

时间:2012-07-14 23:29:17

标签: bash parallel-processing system systems-programming

我有一个包含我想要运行的命令行的文件。该文件包含大约2,000行。

我有8个核心可用。是否可以解析文件并启动8个进程,然后在其中一个程序完成时从文件中执行另一个进程?我希望这能继续下去,直到文件结束。

3 个答案:

答案 0 :(得分:35)

使用GNU parallel。它是一个非常强大的工具,大约20个左右的Linux发行版存在官方软件包。那是什么? You have an excuse as to why you can't use it?这是一个简单的示例,展示了如何并行运行命令列表或文件:

jobs.txt的内容:

sleep 1; echo "a"
sleep 3; echo "b"
sleep 2; echo "c"

命令:

time parallel :::: jobs.txt

结果:

a
c
b

real    0m3.332s
user    0m0.170s
sys     0m0.037s

注意:

如果您希望保持顺序与输入相同,请将-k标志传递给GNU parallel。

如果您有超过八个核心并且只希望处理八个核心,请将-j 8添加到参数列表中。

man page是一本很好的读物,但如果您还没有阅读this tutorial,我强烈建议您投入时间。

答案 1 :(得分:19)

您可以使用 xargs 读取文件,同时将最大进程数限制为可用核心数。例如:

cores=$(fgrep -c processor /proc/cpuinfo)
xargs --arg-file=/tmp/foo \
      --max-procs=$cores  \
      --replace \
      --verbose \
      /bin/sh -c "{}"

答案 2 :(得分:0)

只需运行带有&的命令,即可在后台启动新进程。有一个示例here描述了您的问题的解决方案。