显示scp在云初始化过程中的进度



当我启动一个新服务器时,我会使用云初始化脚本来自动化这个过程。我用跟踪这个过程的进展

$ tail -f /var/log/cloud-init-output.log

当谈到使用scp获取备份文件并通过tar -zx进行管道传输时,我在云初始化脚本中尝试了以下操作:

$ scp myuser@123.45.6.789:path/to/file.tar.gz /dev/stdout | tar -zx

当该命令工作时,scp输出的方便进度指示不会出现在tail -f输出中。。。即,我看不到类似的进展

file.tar.gz   57%   52MB  25.2MB/s   00:02    

我也尝试过类似的bash进程替换:

$ scp myuser@123.45.6.789:path/to/file.tar.gz >(tar -zx)

并且在tail -f输出中仍然没有出现进度指示。

如何在tail -f输出中保留进度指示?特别是在获取较大的备份文件时,要查看进度,保留这些指示将非常方便。

请注意,当我在bash脚本中直接运行以上两个脚本时(顶部有set -x(,"bash进程替换"变体的进度确实显示出来,但"管道"变体没有。。。但是,当跟踪cloudinit日志时,两种变体都没有显示进度。

看起来cloudinit只是将stdoutstderr从所有cloudinit阶段发送到/var/log/cloud-init-output.log(请参阅此处(。

因此,我们可以通过以下调用重新创建云初始化进程(出于本问题的目的(:

$ scp myuser@123.45.6.789:path/to/file.tar.gz >(tar -zx) >output.log 2>&1

然后我们在这个日志文件后面单独加上:

$ tail -f output.log

奇怪的是……在这个output.log文件中从未出现任何进度状态。然而,进展状态肯定会被发送。。。下面的唯一变化是直接指向/dev/stdout而不是output.log

$ scp myuser@123.45.6.789:path/to/file.tar.gz >(tar -zx) >/dev/stdout 2>&1
file.tar.gz   57%   52MB  25.2MB/s   00:02    

那么,当我们将stdout引导到output.log时,为什么我们在/dev/stdout上看到进度状态,而在output.log中没有?

与其他一些工具一样,scp检查其输出是否进入TTY(通过使用isatty(,如果不是,则禁用进度表输出(您可以找到类似的情况,例如,ls --color=auto仅在输出进入终端时才会发出颜色代码(。

您可以在script(如本答案所示(或任何其他工具(如expect(下运行程序,使其输出连接到PTY,从而诱使它认为它正在输出到TTY。

最新更新