如何并行运行命令列表?

mon*_*ing 13 parallel-processing bash system systems-programming

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

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

Ste*_*eve 37

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

内容jobs.txt:

sleep 1; echo "a"
sleep 3; echo "b"
sleep 2; echo "c"
Run Code Online (Sandbox Code Playgroud)

命令:

time parallel :::: jobs.txt
Run Code Online (Sandbox Code Playgroud)

结果:

a
c
b

real    0m3.332s
user    0m0.170s
sys     0m0.037s
Run Code Online (Sandbox Code Playgroud)

笔记:

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

如果您有八个以上内核并且只希望处理八个内核,请添加-j 8到args列表中.

手册页是很好看,但如果你尚未阅读本教程中我会极力推荐的一次性投资.


Tod*_*obs 20

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

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