计算从一个进程传输到另一个进程的字节数

Sim*_*son 19 shell bash pipe

我正在运行一个 shell 脚本,它将数据从一个进程传输到另一个进程

process_a | process_b
Run Code Online (Sandbox Code Playgroud)

有谁知道一种方法来找出两个程序之间传递了多少字节?目前我能想到的唯一解决方案是编写一个小的 c 程序,从标准输入读取,写入标准输出并计算所有传输的数据,将计数存储在环境变量中,例如:

process_a | count_bytes | process_b
Run Code Online (Sandbox Code Playgroud)

有没有人有更简洁的解决方案?

Ama*_*rus 31

使用pv管道查看器。这是一个很棒的工具。一旦你知道了它,你就永远不会知道没有它你是如何生活的。

它还可以向您显示进度条和传输的“速度”。


Phi*_*l P 18

管道通过 dd。dd的默认输入是stdin,默认输出是stdout;当它完成 std​​in/stdout I/O 时,它会向 stderr 报告它传输了多少数据。

如果您想捕获 dd 的输出并且其他程序已经与 stderr 对话,请使用另一个文件描述符。例如,

$ exec 4>~/fred
$ input-command | dd 2>&4 | output-command
$ exec 4>&-
Run Code Online (Sandbox Code Playgroud)

  • 你不能跳过`exec`直接输出到文件吗?`输入命令| dd 2>~/fred | 输出命令` (2认同)
  • 嗯,是的。我显然有“那些”时刻之一,抱歉。 (2认同)

Dav*_*ett 7

process_a | tee >(process_b) | wc --bytes可能工作。然后,您可以将wc的计数重定向到您需要的任何地方。如果process_bstdout/输出任何内容,stderr您可能需要将其重定向到某个地方,如果只是/dev/null.

对于一个稍微做作的例子:

filestore:~# cat document.odt | tee >(dd of=/dev/null 2>/dev/null) | wc --bytes
4295
Run Code Online (Sandbox Code Playgroud)

通过解释:tee让您将输出定向到多个文件(加上标准输出),并且>()构造是 bash 的“进程替换”,在这种情况下,它使进程看起来像一个只写文件,因此您可以重定向到进程和文件(有关使用将输出发送到许多进程的示例,请参见此处,或此问题+答案tee)。