从管道读取数据并以延迟时间写入标准输出。也必须处理二进制文件
收藏

我已经试了大约一个小时,想找到一个解决这个问题的好办法。我的目标基本上是编写一个带宽控制管道命令,可以在各种情况下重复使用(不只是网络传输,我知道scp-l 1234)。我想做的是:
延迟X秒。
从管道读取Y数量(如果不够,则小于y)数据。
将读取的数据写入标准输出。
在哪里?
X可以是1..n
Y可以是1字节,但不能超过某个高值。
我的问题是:
它必须支持bash无法处理的二进制数据。
我走过或至少想到的道路:
使用while read data构造,它过滤使用的编码中的所有白色字符。
使用dd bs=1 count=1和循环。dd似乎没有不同的退出代码,当有什么东西在if而不是。这使得我们很难知道何时停止循环。如果我将标准错误重定向到一个临时文件,读取它以检查是否传输了某些内容(如stderr上打印的统计信息中所示),然后重复此方法,则该方法应该可以工作。但我怀疑,如果用于大量数据,而且如果可能的话,我希望跳过创建任何临时文件,那么速度会非常慢。
关于如何使用bash尽可能干净地解决这个问题,有什么想法或建议吗?


最佳答案:

它不太优雅,但您可以使用一些重定向技巧来捕获由DD复制的字节数,然后使用它作为while循环的退出条件:

while [ -z "$byte_copied" ] || [ "$byte_copied" -ne 0 ]; do 
    sleep $X; 
    byte_copied=$(dd bs=$Y count=1 2>&1 >&4 | awk '$2 == "byte"{print $1}'); 
done 4>&1

但是,如果您的目的是限制传输吞吐量,我建议您使用pv。

公众号