我有一个包含我想要运行的命令行的文件。该文件包含大约2,000行。
我有8个核心可用。是否可以解析文件并启动8个进程,然后在其中一个程序完成时从文件中执行另一个进程?我希望这能继续下去,直到文件结束。
答案 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描述了您的问题的解决方案。