繁体   English   中英

在 cloud-init 过程中显示 scp 的进度

[英]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 阶段的stdoutstderr都发送到/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM