两个同时执行的命令,然后是顺序执行的命令?

两个同时执行的命令,然后是顺序执行的命令?

所以在 Linux 中,我想运行一个脚本 4 次,然后对输出进行一些操作。

我可以:

script 1 > output1.txt
script 2 > output2.txt
script 3 > output3.txt
script 4 > output4.txt
cat output1.txt output2.txt output3.txt output4.txt > output5.txt
sort output5.txt | uniq -u 

但我希望前四个并行运行(更快)。如果我将它们放在后台,那么它会跳到第五行,直到前四个完成才会成功。

编辑:感谢您的回复。我尝试了其中几个,但我不确定它们是否会起作用,因为我需要 (a) 并行运行 4 个不同的脚本,而不是运行四次相同的脚本,并且 (b) 每个脚本的输出都需要保存到 .txt 文件中(这非常重要)。我已更新上述内容以反映这一点。

我办公室里的人都喜欢使用 xargs,所以这也是我的偏好(尽管我对任何东西都持开放态度)。

谢谢!

答案1

等待bash 的内置命令可以解决这个问题......

script 1 > output1.txt &
script 2 > output2.txt &
script 3 > output3.txt &
script 4 > output4.txt &
wait
cat output1.txt output2.txt output3.txt output4.txt > output5.txt
sort output5.txt | uniq -u 

答案2

moreutils'parallel

parallel -- script-1 script-2
cat out1 out2 out3 out4

第二行将在所有作业退出后运行parallel。如果您的脚本包含参数,则需要将其括起来,例如

parallel -- 'script-1 argument1' script-2

也可以通过以下方式实现GNU 并行但由于明显的命名冲突,我的系统上没有它。我认为你只需要列出脚本列表,然后:

cat list-of-scripts > parallel -j4
cat out1 out2 out3 out4

如果可能的话,该-j4方法parallel将在 4 个核心上执行。

答案3

我建议使用 GNU parallel。有一个方便的教程这里。它可以让你并行运行所有四个脚本,然后运行第五个命令,或者你可以将其设置为将前四个脚本的输出管道传输到第四个脚本,从而并行运行所有五个脚本。以下是并行运行所有四个脚本的命令:

parallel ::: script-1 script-2 script-3 script-4

您可以将输出直接导入第五个命令。默认情况下,parallel将对每个命令的输出进行分组,例如,如果脚本 2 首先完成,则输出流将以脚本 2 的全部输出开始,然后是下一个要完成的命令的输出。--line-buffer如果您不关心不同命令的输出行混合,则使用此选项。--keep-order如果您需要按顺序显示命令的输出,即脚本 1 的输出,然后是脚本 2 的输出,等等,则使用此选项。

另一个选项是直接使用xargs,它应该已经安装在您的系统上。xargs有一个-P选项允许您指定并发进程的数量。请注意,它不处理输出分组,因此您不能直接输入第五个命令。通常您-n也需要设置。

相关内容