所以我有这样一种情况,我并行运行大量命令并将输出通过管道传输到另一个使用输出的脚本。我遇到的问题是我执行输出处理的脚本需要知道特定命令何时完成执行。
我正在使用 --tag
选项,以便我知道什么命令生成了输出,但目前我必须等到并行运行所有命令后才能知道我没有将从特定命令获得更多输出。根据我对并行的理解,我看到了以下可能的解决方案,但没有一个真正适合我。
我可以使用
--line-buffer
选项对输出行进行分组,这样它 看起来是按顺序运行的。然后每当我看到输出 从下一个命令我知道前一个已经完成,但是 这样做会减慢我的速度,因为一个命令可能需要 30 秒才能完成 完成后可能还有 20 个其他命令只用了 一秒钟,我希望尽可能接近实时地处理它们 可能的。我可以将我的命令包装在一个输出“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/