use*_*454 4 linux process-management parallelism
我正在尝试并行运行多组命令。有 10 个组,每个组有 3 个命令。我希望在每个组内顺序执行并并行执行 10 个组。我正在尝试这样的事情,但这似乎不起作用:
(command11; command12; command13 &)
(command21; command22; command23 &)
(command31; command32; command33 &)
(command41; command42; command43 &)
...
Run Code Online (Sandbox Code Playgroud)
差点被击中。正确的语法是:
(command11; command12; command13) &
(command21; command22; command23) &
(command31; command32; command33) &
(command41; command42; command43) &
Run Code Online (Sandbox Code Playgroud)
或者,如果您希望在命令失败后将命令排除在组内,则语法为
command11 && command12 && command13 &
command21 && command22 && command23 &
command31 && command32 && command33 &
command41 && command42 && command43 &
Run Code Online (Sandbox Code Playgroud)
请注意,“ &&”与“ &”的含义非常不同。" &&" 表示,该命令仅在前一个准备好后才会运行,并且只有在没有失败的情况下执行(即其退出代码为零)。" &" 表示之前的命令将与主执行行并行运行,它的失败或成功无关紧要。
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
Run Code Online (Sandbox Code Playgroud)
它使用了非常有用的xargs工具。当然,您可以通过管道将任何内容导入其中,例如,如果您想在 10 个线程中并行处理数千个内容,它就可以。
它以某种方式工作,它bash -c为所有输入行调用命令parallel,但是,总是最多 10 个子进程将同时运行(这是由 完成的-P 10)。xargs仅当所有 bash 进程都被执行时,该命令才会结束。
GNU 也编写了一个工具,命名parallel为。据我所知,它的语法比xargss更清晰一些,尽管它的功能较少,而且不那么常见。可能其他答案会解释它。
如果你在nodejs框架中工作,还有一个非常常用的工具 ( npm install parallel),它主要用于并行化自动化构建任务,但它也可以轻松地用于 shellscripts。
这在普通环境中不是一个好主意,因为npm包不能很好地与 Unix 数据包处理环境集成。尽管它的语法要简单得多,但它的功能远远落后于所有其他解决方案。
对于您的特定问题,我可能会在简单的情况下选择第二种解决方案,在更复杂的情况下选择基于 xargs 的解决方案。
使用GNU Parallel,它将是:
parallel 'command{}1; command{}2; command{}3' ::: {1..4}
Run Code Online (Sandbox Code Playgroud)
或者,如果您更喜欢命令替换:
parallel 'command{}1; command{}2; command{}3' ::: $(seq 4)
Run Code Online (Sandbox Code Playgroud)
GNU Parallel 有大约 150 个作业控制选项,您可能想要学习但从视频教程开始。
| 归档时间: |
|
| 查看次数: |
4430 次 |
| 最近记录: |