当我启动一个新服务器时,我会使用云初始化脚本来自动化这个过程。我用跟踪这个过程的进展
$ 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只是将stdout
和stderr
从所有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。