2008-10-14 53 views
10

我想從安裝腳本(使用scp)捕獲輸出並記錄下來。但是,我沒有得到scp正在打印的所有內容,即進度條。如何最好地捕獲和記錄scp輸出?

屏輸出:

複製 /用戶2/CDB /構建的/ tmp/UAT/myfiles的/ *到 服務器/用戶/ myfiles的是CDB

CDB @服務器的口令: MYFILE 100 %| ***************************** | 2503 00:00

日誌輸出:

複製 /用戶2/CDB /構建的/ tmp/UAT/myfiles的/ *到 服務器/用戶/ myfiles的是CDB

我真的很想知道我的文件到達了那裏。這是我現在試圖無效:

myscript.sh 2> & 1 | tee mylogfile.log

有沒有人有一個很好的方法來捕獲scp輸出並記錄下來?

謝謝。

回答

7

它看起來像你只是缺少scp是否成功的日誌。

我猜滾動條不打印到標準輸出,並使用ncurses或其他類型的TUI?

你可以看看scp的返回值,看它是否成功。像

scp myfile [email protected]:. && echo success! 

man scp

scp exits with 0 on success or >0 if an error occurred. 
1

也許你可以用'script'來登錄終端會話。

0

是的,我最近試圖從proc_open() 一個PHP腳本中獲取輸出我失去了一個安靜的時間試圖讓輸出:-) 但其有點晚了在這裏,然後我讀這篇文章在這裏讓我意識到,我真的不需要這個垃圾輸出到我的腳本

只是退出代碼將完成這項工作:-)

$ exit_code = proc_close($ process);

20

scp使用控制代碼將其進度條打印到終端。它會檢測你是否重定向輸出,從而省略進度條。

讓您可以通過欺騙SCP以爲它在使用被默認安裝在大多數發行版的「腳本」命令終端運行:

script -q -c "scp server:/file /tmp/" > /tmp/test.txt 

test.txt的內容將是:

file 0% 0  0.0KB/s --:-- ETA 
file 18% 11MB 11.2MB/s 00:04 ETA 
file 36% 22MB 11.2MB/s 00:03 ETA 
file 54% 34MB 11.2MB/s 00:02 ETA 
file 73% 45MB 11.2MB/s 00:01 ETA 
file 91% 56MB 11.2MB/s 00:00 ETA 
file 100% 61MB 10.2MB/s 00:06 

......這可能是你想要的。

我偶然發現這個問題,同時將交互式腳本的輸出重定向到日誌文件中。由於您始終可以評估退出代碼,因此日誌中沒有結果並不是問題。但我真的想讓交互式用戶看到進度條。這個答案解決了這兩個問題。

+0

請注意:如果腳本可用,您可能希望對腳本使用`--return`(`-r`)選項,以便保留子進程的返回代碼。否則,即使命令失敗,您的`script`命令也會很高興地返回成功代碼。 – jwd 2015-06-08 17:21:26

1
scp myfile [email protected]:. && echo success! 

是非常有益的,但在寫入信息給我改成了這樣

scp myfile [email protected]:. && echo myfile successfully copied! >> logfile 2>&1 

一個日誌文件,這將寫入「MYFILE複製成功!」消息到日誌文件。

0

嘗試:

scp server:/file /tmp/ > /dev/tty 
+0

添加對此答案的解釋將是一個好主意。 (這也使我不太可能將輸出傳送到他的日誌文件中。) – 2014-10-28 18:24:45

0

我不能評論尚未:(​​所以我會在這裏補充更新...

@馬丁有最好的解決方案,我雖然如果你的SCP命令中途你的腳本那麼它的實際運行後命令後輸出可能出現。

我認爲這是因爲腳本必須運行在一個子shell命令,但我還沒有測試。

編輯:它確實產生了一個shell,所以如果你需要的東西在順序方式運行(並確實失敗)(如在構建腳本),那麼你將不得不添加一些圍繞使用腳本命令的邏輯。

腳本-q -c「你的命令」 & &睡眠1

或相似的,所以,對於子shell你父shell等待在移動之前完成的東西。

+0

腳本-qc'sleep 10'阻止我的系統執行,而echo |腳本-qc'睡眠10'沒有。解決方法:echo |腳本-qc'睡眠10'|貓。我認爲只要stdin/err/out仍然打開,shell就會阻塞。 – Martin 2015-06-15 13:48:10

0
$ grep -r "Error" xyz.out > abc.txt 

在上面的命令中,我將輸出存儲到文件abc.txt中。

grep命令是用於搜索文本方含錯誤在文件xyz.out並存儲在輸出的abc.txt而不顯示在控制檯上。