【问题标题】:cURL takes forever to do an FTP uploadcURL 需要永远进行 FTP 上传
【发布时间】:2013-03-09 12:30:23
【问题描述】:

我在 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

问题是有时 curl 无法完成上传,只是坐在那里阻止其他下载显示

  % 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

如何修复我的脚本以正常上传文件?

【问题讨论】:

    标签: bash curl upload ftp cygwin


    【解决方案1】:

    感谢你们的帮助,我选择了wput

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

    【讨论】:

      【解决方案2】:

      据推测,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,直到你确定你的论点是正确的!

      【讨论】:

      • 我希望 ssh 是一个选项,我将使用各种延迟进行测试并报告。
      • 使用长达 30 秒的超时并不能解决问题
      • 超时对您没有帮助,您是否尝试在 curl 调用之间放置“睡眠 10”?
      【解决方案3】:

      试试这些 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 提供有关传输的更多信息,如果您试图找出传输如此缓慢的原因,这可能会有所帮助。

      【讨论】:

      • 我看不出这些对我有什么帮助,这里不能选择中止转移。我使用了-v,一切都没有问题,但是有些上传停滞了
      • 也许可以。例如,如果连接超时,则可以检查 curl 的返回代码。需要稍微修改脚本以检查返回码并重复 curl 命令直到成功。这将减少上传过程中的麻烦干预。
      猜你喜欢
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 2014-11-23
      • 1970-01-01
      相关资源
      最近更新 更多