cronjob每隔3小时运行一次使用SFTP下载文件。预定的程序是用Perl编写的,使用的模块是Net::SFTP::Foreign
。SFTP文件同时上传和下载
能否Net::SFTP::Foreign
下载文件仅部分使用SFTP上传?
如果是这样,我们需要检查修改日期,检查复制过程完成SFTP文件?
假设一个新的文件被人在SFTP上传和他文件上传/复制过程中。如果同时尝试下载,是否需要编写只读取文件的一部分的可能性?
cronjob每隔3小时运行一次使用SFTP下载文件。预定的程序是用Perl编写的,使用的模块是Net::SFTP::Foreign
。SFTP文件同时上传和下载
能否Net::SFTP::Foreign
下载文件仅部分使用SFTP上传?
如果是这样,我们需要检查修改日期,检查复制过程完成SFTP文件?
假设一个新的文件被人在SFTP上传和他文件上传/复制过程中。如果同时尝试下载,是否需要编写只读取文件的一部分的可能性?
这不是SFTP 客户您使用的问题,这是无关紧要的。这就是SFTP 服务器如何处理这种情况。
一些SFTP服务器可能锁定文件被上传,导致您无法访问它,而仍然被上传它。但是大多数SFTP服务器,特别是常见的OpenSSH SFTP服务器,不会锁定文件。
这个问题没有通用的解决方案。检查时间戳或大小更改可能适用于您,但它几乎不可靠。
有一些常见的解决方法的问题:
有关详细信息,请参阅我对SFTP file lock mechanism的回答。
您可以检查文件的大小。
这样做,当上传过程也是你的操控下最简单的方法,就是上传使用时间名称的文件(例如,foo-20170809.tgz.temp
),一旦上传完成,重命名然后(Net::SFTP::Foreign::put
方法支持atomic
选项,就是这样做)。然后在下载端,用与时态文件相对应的名称过滤出文件。
无论如何,Net::SFTP::Foreign
get
和rget
方法可以被指示通过选项resume => 1
恢复转移。另外,如果你有完整的SSH访问SFTP服务器,你可以使用fuser
或类似的工具(尽管如此,请注意,即使这样,文件可能仍然在写入要下载的文件如果例如存在一些网络问题并且上传者在恢复传输之前需要重新连接),则不完整。