2013-03-20 2 views
0

cygwin에서 실행하는 bash에서 길쭉한 배포 스크립트를 작성했습니다.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 

문제는 때로는 업로드를 완료 할 수 곱슬 곱슬되어 그냥 다른 차단이 앉아 : 원격 서버에 배포하는 경우, 스크립트는 다음과 같이 컬을 사용하여 FTP 서버에 생성 된 응용 프로그램을 업로드합니다

% 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의 호출 사이에 지연을 도입하는 것이 좋습니다.

대상 서버가 rsyncssh 이상으로 지원하는 것이 이상적입니다. 대역폭 최적화가 가장 이상적입니다.


업데이트
는 빠른 검색 후, FTP 미러링 기능을 제공 lftp라는 명령 줄 프로그램이있다. 가이드 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

+0

최대 30 초의 시간 초과를 사용하여 문제를 해결하지 못했습니다. – Dreen

+0

시간 초과가 도움이되지 않습니다. curl 호출 사이에 "sleep 10"을 넣으려고 했습니까? – MattH

2

이 컬 옵션을 사용하여 동작을 제어하십시오.

connect-timeout <secs> 연결 시도가 실패하기 전에 초를 설정하십시오.

--speed-time은 말풍선이 전송을 중단하기 전에 느린 전송 시간 (초)을 초당 --speed_limit 바이트 이상으로 설정할 수 있습니다.

--speed_limit은 curl이 전송을 중단하는 바이트/초 이하의 한계를 설정합니다.

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

-v는 전송이 느린 이유를 알아 내려고하는 경우 도움이 될 수 있습니다 전송에 대한 추가 정보를 제공합니다.당신의 도움들에 대한

+0

이것이 내가 어떻게 도움이 될지 모르겠다. 전송을 중단하는 것은 여기서 선택이 아니다. '-v'를 사용하면 모든 것이 문제없이 연결되지만 그 중 일부 업로드는 정체됩니다. – Dreen

+0

. 예를 들어 연결 시간이 초과 된 경우 curl의 리턴 코드를 검사 할 수 있습니다. 리턴 코드를 확인하고 성공할 때까지 curl 명령을 반복하기 위해 스크립트를 약간 수정해야합니다. 이렇게하면 업로드하는 동안 방해가되는 작업을 줄일 수 있습니다. – suspectus

관련 문제