14

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

我有 8 个内核可用。是否可以解析文件并启动 8 个进程,然后在其中一个程序完成时从文件中执行另一个进程?我希望这一直持续到文件末尾。

4

3 回答 3

39

使用GNU 并行。这是一个非常强大的工具,官方软件包存在大约 20 个左右的 linux 发行版。那是什么?你有借口为什么你不能使用它?这是一个简单的示例,展示了如何并行运行命令列表或文件:

内容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 并行。

如果您有八个以上的核心并且只希望使用八个核心进行处理,请添加-j 8到 args 列表中。

手册页很好读,但如果您尚未阅读本教程,我强烈建议您花时间投资。

于 2012-07-15T05:36:56.220 回答
24

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

cores=$(fgrep -c processor /proc/cpuinfo)
xargs --arg-file=/tmp/foo \
      --max-procs=$cores  \
      --replace \
      --verbose \
      /bin/sh -c "{}"
于 2012-07-15T05:26:11.623 回答
0

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

于 2012-07-15T00:11:41.727 回答