如何并行运行一系列命令?

17

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

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


请参阅进程管理 - Dennis Williamson
3个回答

41

使用 GNU parallel 。它是一个非常强大的工具,为大约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

注意事项:

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

如果您拥有超过八个核心,但只希望使用八个核心进行处理,请在 args 列表中添加 -j 8

手册页面 是一个不错的阅读材料,但如果您还没有阅读过这份教程,我强烈建议您花时间去学习一下。


GNU parallel在Ubuntu 11.10上不可用,但在Debian sid上可用。值得注意的是,这个例子不能直接使用moreutils包中的parallel工具,因为它有一些不同的语义。 - Todd A. Jacobs
不需要“-j 8”参数 - 它会自动检测。Ubuntu软件包地址:https://build.opensuse.org/package/binaries?package=parallel&project=home%3Atange&repository=xUbuntu_11.10 - Ole Tange
为了并行运行文件中的命令,您可以执行 cat /path/to/file.txt | parallel - Mr Purple

26

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

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

1
谢谢!这种方法比其他所有答案都要好。手动设置进程通常会导致性能不足或限流。 - thechargedneutron

0

通过在命令末尾加上 &,你可以轻松地在后台启动新进程。这里有一个示例描述了解决问题的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接