我正在尝试并行运行多组命令。有10组,每组有3个命令。我希望每个组内顺序执行,并在 10 个组内并行执行。我正在尝试这样的事情,但这似乎不起作用:
(command11; command12; command13 &)
(command21; command22; command23 &)
(command31; command32; command33 &)
(command41; command42; command43 &)
...
答案1
如你所愿
差一点就撞到了正确的语法是:
(command11; command12; command13) &
(command21; command22; command23) &
(command31; command32; command33) &
(command41; command42; command43) &
如你所愿,但更好
或者,如果你想要的话在一个组内命令失败后要忽略的命令,则语法为
command11 && command12 && command13 &
command21 && command22 && command23 &
command31 && command32 && command33 &
command41 && command42 && command43 &
请注意,“ &&
”与“ ”的含义截然不同&
。 “ &&
”表示,该命令仅在前一个命令准备好后才会运行,并且仅当执行时没有失败(即其退出代码为零)。 “ &
”表示前面的命令将与主执行线并行运行,其失败或成功并不重要。
使用xargs
工具
但是,这些解决方案有一个缺点,即您等不及了后全部这些命令的执行。为此,我们还有一些技巧。特别是在您的情况下,执行此操作所需的命令是
for i in 1 2 3 4 5 6 7 8 9 10
do
echo "command${i}1 && command${i}2 && command${i}3"
done | xargs -P 10 -l 1 bash -c
它使用非常有用的xargs
工具。当然,您可以将任何内容通过管道传输到其中,例如,如果您想在 10 个线程中并行处理数千个事物,它就可以了。
它的工作方式是,它bash -c
为所有输入行调用命令,平行线,但是,总是最多有 10 个子进程同时运行(这是由 完成的-P 10
)。xargs
仅当所有 bash 进程都执行完毕后,命令才会结束。
并行工具(参见其他答案)
GNU 也编写了一个parallel
同样命名的工具。据我所知,它的语法比 s 更清晰一些xargs
,尽管它的功能较少,而且不太常见。可能其他答案会解释它。
NodeJs“并行”模块
如果您在节点js框架中,还有一个非常常用的工具(npm install parallel
),它主要用于并行化自动化构建任务,但也可以轻松地在 shellscript 中使用。
在常见环境中这不是一个好主意,因为npm
包不能很好地与 Unix 数据包处理环境集成。尽管它的语法要简单得多,但其功能却远远落后于所有其他解决方案。
对于您的具体问题,我可能会在简单的情况下选择第二种解决方案,在更复杂的情况下选择基于 xargs 的解决方案。
答案2
和GNU 并行这将是:
parallel 'command{}1; command{}2; command{}3' ::: {1..4}
或者如果你愿意的话命令替换:
parallel 'command{}1; command{}2; command{}3' ::: $(seq 4)
GNU Parallel 有大约 150 个作业控制选项,您可能想研究它们,但从视频教程。