当我通过 VPN 和 SSH 通过 DSL 连接时,我经常在通过 1GBit 以太网连接的 2 台服务器之间复制许多文件。问题是,需要通过慢速连接将详细输出(每个复制文件 1 行)发送到我的 ssh 客户端,这会减慢复制操作的速度(我感觉是这样)
我使用通过创建的测试文件对此进行了测试
dd if=/dev/urandom | base64 | dd of=testfile count=10M bs=1
测试运行 A(无输出)
# time sh -c 'cat testfile > /dev/null'
sh -c 'cat testfile > /dev/null' 0.00s user 0.02s system 97% cpu 0.025 total
测试运行 B(所有输出均通过 ssh/vpn)
# time sh -c 'cat testfile'
sh -c 'cat testfile' 0.00s user 0.45s system 0% cpu 4:31.10 total
(我知道,这不是一个好的测试,但它表明了问题)
有没有办法不减慢操作速度并异步获取输出。我设想过删除除每秒指定计数以外的所有行或类似的东西。
此刻我启动屏幕并在操作运行时分离。
我在 Windows 上使用 putty,在 Linux 上使用 openssh-client
有任何想法吗?
答案1
你没有说你用什么来复制,但我想这并不重要。
您可以尝试使用pv
:
your-copy-command 2>&1 | tee progress.out | pv -trlb >/dev/null
这为您提供了一个低开销的进度指示器:
502 0:00:20 [25.1/s ]
显示行数文件名(不是文件内容),否则您将会看到这些内容。该tee
命令会将此输出保存在远程系统上,以防您需要查看它。然后输出将被丢弃。
这是一种无需pv
your-copy-command 2>&1 | tee progress.out | progress >/dev/null
哪里progress
有这样的脚本:
#!/bin/bash
SECONDS=0 # auto update variable
while read -r line
do
if ((count++ % 10 == 9))
then
printf "%s sec, %s lines\r" $SECONDS $count >&2
fi
echo "$line"
done
答案2
如果将输出导入 less 会发生什么情况?如 cp ab | less
答案3
如果我理解正确的话,这听起来就像是你因为终端缓冲而变慢了!
您是否需要查看传输的输出?如果不需要,请使用-q
或适当的选项来抑制每个文件的传输输出。如果您需要该数据,请将输出重定向到文件以供以后查看。然后您就可以查看tail -f
该文件了。