bash - 有没有办法在并行进程的进程终止时刷新标准输出

标签 bash shell parallel-processing multiprocessing flush

我在一台机器上并行运行多个独立程序。 这些进程(例如 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/

相关文章:

linux - 从 php 代码运行的 Shell 脚本正在使用/sbin/nologin 如何将其设置为/bin/bash

python - 多处理一次运行 1 个线程 x 次

bash - 如何将字段名称设置为文件名bash/awk

linux - 在 bash/shell 中打印 url 期间未绑定(bind)变量

json - Bash 脚本输出 JSON 变量到文件

shell - 抑制 Vagrant shell 配置输出

r - R中使用parallelSVM的makeCluster占用所有内存和交换

用于条件/替代的推测执行的 Haskell 策略

c - 输入从不存在的文件重定向到 fopen()

python - 将命令重定向到 Python 中另一个的输入