我在一台机器上并行运行多个独立程序。 这些进程(例如 100 个)都相对较短(<5 分钟),并且它们的输出仅限于几百行(~千字节)。
通常,终端中的输出会变得困惑,因为进程直接写入同一缓冲区。我希望这些输出未被破坏,以便更容易调试某些进程。我可以将这些输出写入临时文件,但我想限制磁盘 IO,并且如果可能的话更喜欢另一种方法。它需要清理,并且可能不会真正提高代码的可读性。
是否有任何 shell native 方法允许缓冲区进行 PID 分离,然后在进程终止时刷新到 stdout/stderr?您认为还有其他方法可以做到这一点吗?
更新
我最终使用了 @Gem 评论中的 tail -n 1000000
技巧。由于我使用的命令很长(涵盖多行)并且我已经使用了子 shell ( ... ) &
,这与 ( ... ) & 相比是一个非常小的变化
到 ( ... ) 2>&1 |尾-n 1000000 &
。
最佳答案
您可以使用GNU Parallel来做到这一点。使用 -k
保持输出顺序,并使用 :::
分隔要传递给程序的参数。
这里我们并行运行 4 个 echo
实例:
parallel -k echo {} ::: {0..4}
0
1
2
3
4
现在添加 --tag
以使用您正在使用的文件名或参数来标记输出行:
parallel --tag -k 'echo "Line 1, param {}"; echo "Line 2, param {}"' ::: {1..4}
1 Line 1, param 1
1 Line 2, param 1
2 Line 1, param 2
2 Line 2, param 2
3 Line 1, param 3
3 Line 2, param 3
4 Line 1, param 4
4 Line 2, param 4
您应该注意到,每一行都在左侧标记有参数,并且每个作业的两行都放在一起。
您现在可以指定输出的组织方式。
- 使用
--group
按作业对输出进行分组 - 使用
--line-buffer
一次缓冲一行 - 如果您希望输出全部混合,但一旦可用,请使用
--ungroup
关于bash - 有没有办法在并行进程的进程终止时刷新标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51873520/