[英]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.