所以在 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
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
也需要设置。