【问题标题】:SFTP file uploading and downloading at same timeSFTP文件同时上传和下载
【发布时间】:2017-10-06 12:32:35
【问题描述】:

cronjob 每 3 小时运行一次,以使用 SFTP 下载文件。调度程序是用Perl编写的,使用的模块是Net::SFTP::Foreign

Net::SFTP::Foreign 可以下载使用 SFTP 仅部分上传的文件吗?

如果是这样,我们是否需要检查 SFTP 文件修改日期以检查复制过程是否完成?

假设某人正在 SFTP 中上传一个新文件,并且他正在进行文件上传/复制。如果同时尝试下载,我是否需要编写代码以仅获取文件的一部分?

【问题讨论】:

    标签: perl sftp


    【解决方案1】:

    这不是您使用的 SFTP 客户端 的问题,这无关紧要。这就是 SFTP 服务器 处理这种情况的方式。

    某些 SFTP 服务器可能会锁定正在上传的文件,阻止您在该文件仍在上传时访问它。但大多数 SFTP 服务器,尤其是常见的 OpenSSH SFTP 服务器,不会锁定文件。

    这个问题没有通用的解决方案。检查时间戳或大小更改可能对您有用,但它几乎不可靠。

    有一些常见的解决方法:

    • 上传完成后让上传者上传“完成”文件。让您的程序等待“完成”文件出现。

    • 您可以拥有专用的“上传”文件夹,并让上传者(自动)将上传的文件移动到“完成”文件夹。让您的程序仅查看“完成”文件夹。

    • 对正在上传的文件有一个文件命名约定(“.filepart”),并让上传者(原子地)在上传后将文件重命名为其最终名称。让你的程序忽略“.filepart”文件。

      请参阅(我的)文章Locking files while uploading / Upload to temporary file name,了解如何实施这种方法。

      此外,某些 FTP 服务器内置了此功能。例如带有HiddenStores directive 的 ProFTPD。

    • 一个严重的技巧是定期检查文件属性(大小和时间),如果属性在一段时间内没有改变,则认为上传完成。

    • 您还可以利用某些文件格式具有清晰的文件结束标记(如 XML 或 ZIP)这一事实。所以你知道,当你下载一个不完整的文件时。

    详情见我对SFTP file lock mechanism的回复。

    【讨论】:

      【解决方案2】:

      您可以检查文件的大小。

      1. 连接到 SFTP。
      2. 检查文件大小。
      3. 睡眠 5/10 秒。
      4. 再次检查文件大小。
      5. 如果大小没有改变,请下载文件,如果大小改变,请执行第 3 步。

      【讨论】:

        【解决方案3】:

        当上传过程也在您的控制之下时,最简单的方法是使用临时名称上传文件(例如,foo-20170809.tgz.temp),然后在上传完成后重命名(Net::SFTP::Foreign::put 方法支持 @ 987654323@ 选项就是这样做的)。然后在下载端,过滤掉名称对应临时文件的文件。

        无论如何,Net::SFTP::Foreigngetrget 方法可以通过resume => 1 选项被指示恢复传输。

        此外,如果您对 SFTP 服务器具有完整的 SSH 访问权限,您可以使用 fuser 或其他类似工具检查其他进程是否仍在写入要下载的文件(不过,请注意,即使那样,该文件可能是不完整的,例如有一些网络问题,上传者需要重新连接才能恢复传输)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-14
          • 1970-01-01
          • 2011-06-20
          • 2012-06-09
          • 2013-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多