2013-03-20 79 views
0

我已經寫了一個很長的部署腳本在bash中,我在cygwin下運行。如果部署到遠程服務器,該腳本將使用curl所產生的應用程序上傳到FTP服務器,這樣的:cURL永遠需要做FTP上傳

if [ $where == "remote" ] 
then 
    for i in `find deploy/ -type f`; do 
     curl.exe -u "***:***" -T $i "ftp://address.co.uk/public_html/java/desktop/$i" 
    done 
fi 

問題有時捲曲只是無法完成上傳,只是坐在那裏擋住了其他下載顯示

% Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
    0  0 0  0 0  0  0  0 --:--:-- 0:15:14 --:--:--  0 

這種特殊的文件是〜2,5KB所以它不應該花這麼長時間......我要殺死腳本並重新開始......直到所有的人都正確上傳。

我試着加入&在後臺運行它,但是我獲得了很多curl: (28) Timeout was reached所有上傳開始的地方。

如何解決我的腳本無上傳文件的問題?

回答

1

感謝您的幫助球員,我去wput

./wput/wput.exe -N deploy "ftp://****:****@address.co.uk/public_html/java/desktop/" 
1

猜測,您的目標服務器上的FTP連接或所有連接都受速率限制。

這樣會導致某些文件上傳的延遲是由於丟棄了SYN數據包造成的。

我建議你運行一個FTP會話,並使用它遞歸上傳或引入curl調用之間的延遲。

理想情況下,您的目標服務器將支持rsync超過ssh:這將是帶寬最佳。


更新
快速搜索後,有一個名爲lftp一個命令行程序,提供FTP鏡像功能。

從引導here改編,這樣的事情應該做的伎倆:

#!/bin/bash 
HOST='address.co.uk' 
USER='myuser' 
PASS='mypass' 
TARGETFOLDER='/public_html/java/desktop/' 
SOURCEFOLDER='deploy/' 

lftp -f " 
open $HOST 
user $USER $PASS 
lcd $SOURCEFOLDER 
mirror --reverse --delete --verbose $SOURCEFOLDER $TARGETFOLDER 
bye 
" 

我建議你做不--delete直到你確信你已經得到了論據吧!

+0

我想SSH是一種選擇,我要測試使用不同的延遲和彙報。 – Dreen 2013-03-20 13:39:00

+0

使用長達30秒的超時並沒有解決問題 – Dreen 2013-03-20 14:39:39

+0

超時不會幫助你,你有沒有嘗試在'curl'調用之間放置一個「睡眠10」? – MattH 2013-03-20 14:41:08

2

嘗試使用這些捲曲選項來控制它的行爲。

connect-timeout <secs>設置連接嘗試失敗之前的秒數。

--speed-time設置在curl中止傳輸之前,允許每秒傳輸速度低於--speed_limit字節的秒數。

--speed_limit設置curl將中止傳輸的限制,以字節/秒爲單位。

curl --connect_timeout <seconds> --speed-time <secs> --speed_limit <speed in bytes/sec> 

-v給出了轉移,如果你想找出爲什麼轉移是這麼慢這可以幫助更多的信息。

+0

我看不出這些會如何幫助我,因此放棄轉帳不是一種選擇。我使用了'-v',並且所有連接都沒有問題,但是其中一些上傳停滯了。 – Dreen 2013-03-20 13:38:15

+0

它可能會發生。如果連接超時,例如curl的返回碼可以被檢查。該腳本需要稍微修改以檢查返回代碼並重復curl命令直到成功。這將減少上傳過程中的麻煩干預。 – suspectus 2013-03-20 13:57:55