簡體   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