gpt4 book ai didi

bash - GNU Parallel - 检测并行运行的命令已完成

转载 作者:行者123 更新时间:2023-11-29 09:27:42 25 4
gpt4 key购买 nike

所以我有这样一种情况,我并行运行大量命令并将输出通过管道传输到另一个使用输出的脚本。我遇到的问题是我执行输出处理的脚本需要知道特定命令何时完成执行。

我正在使用 --tag 选项,以便我知道什么命令生成了输出,但目前我必须等到并行运行所有命令后才能知道我没有将从特定命令获得更多输出。根据我对并行的理解,我看到了以下可能的解决方案,但没有一个真正适合我。

  1. 我可以使用 --line-buffer 选项对输出行进行分组,这样它看起来是按顺序运行的。然后每当我看到输出从下一个命令我知道前一个已经完成,但是这样做会减慢我的速度,因为一个命令可能需要 30 秒才能完成完成后可能还有 20 个其他命令只用了一秒钟,我希望尽可能接近实时地处理它们可能的。

  2. 我可以将我的命令包装在一个输出“Process”的小型 bash 脚本中使用一些 ID DONE' 以获得命令完成的通知。我不太喜欢这个,因为我正在运行数百个命令一次并且真的不想添加所有这些额外的 bash过程。

我真的希望我只是在文档中遗漏了一些东西,并且那里有一个标志可以做我正在寻找的事情。

我的理解是并行是在 perl 中实现的,我对此很满意,但我宁愿不必自己添加功能,除非它是完全必要的。

非常感谢任何帮助或建议。

最佳答案

--tag 的默认行为应该可以完美运行。在作业完成之前,它不会输出任何内容。然后你的后处理器可以简单地从行的开头获取参数。

例子:

parallel -j3 --tag 'echo Job {} start; sleep {}; echo Job {} ended' ::: 7 1 3 5 2 4 6

如果你想保留顺序:

parallel -j3 --keep-order --tag 'echo Job {} start; sleep {}; echo Job {} ended' ::: 7 1 3 5 2 4 6

注意如果输出立即完成,作业将如何混合。与 --ungroup 比较(你想要):

parallel -j3 --ungroup 'echo Job {} start; sleep {}; echo Job {} ended' ::: 7 1 3 5 2 4 6

关于bash - GNU Parallel - 检测并行运行的命令已完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35278877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com