[英]Showing progress of scp during cloud-init process
当我启动一个新服务器时,我使用一个 cloud-init 脚本来自动化这个过程。 我关注这个过程的进展:
$ tail -f /var/log/cloud-init-output.log
在使用scp
获取备份文件并通过tar -zx
进行管道传输时,我在 cloud-init 脚本中尝试了以下操作:
$ scp myuser@123.45.6.789:path/to/file.tar.gz /dev/stdout | tar -zx
虽然此命令有效,但scp
输出的便捷进度指示不会出现在tail -f
output... 中,即我看不到如下进度:
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
output 中仍然没有出现进度指示。
如何在tail -f
output 中保留进度指示? 特别是在获取较大的备份文件时查看进度,保留这些指示非常方便。
请注意,当我直接在 bash 脚本中运行上述两项时(顶部带有set -x
),确实会显示“bash 进程替换”变体而不是“管道”变体的进度......但是当拖尾云时-init 日志,两种变体都显示进度。
看起来 cloud-init 只是将所有 cloud-init 阶段的stdout
和stderr
都发送到/var/log/cloud-init-output.log
(请参见 此处)。
因此,我们可以使用以下调用重新创建 cloud-init 进程(出于此问题的目的):
$ 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
检查其 output 是否要进入 TTY(通过使用isatty
),如果不是,则禁用进度表 output (您可以找到类似的情况,例如, ls --color=auto
仅在以下情况下发出颜色代码output 去终端)。
您可以通过在script
(如this answer中所示)或运行程序的任何其他工具(例如expect
)下运行它来欺骗它认为它正在输出到TTY,其output连接到PTY。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.