我在bash中编写了一个很长的部署脚本,我在cygwin下运行。如果部署到远程服务器,脚本将使用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
。
如何修复我的脚本以无问题地上传文件?
答案 0 :(得分:2)
尝试使用这些curl选项来控制它的行为。
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
提供了有关转移的更多信息,如果您试图找出转移速度如此之慢的原因,这可能有所帮助。
答案 1 :(得分: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
的情况下执行此操作,直到您确定自己的论点正确为止!
答案 2 :(得分:1)
感谢您的帮助,我选择了wput:
./wput/wput.exe -N deploy "ftp://****:****@address.co.uk/public_html/java/desktop/"