cronjob每3小时运行一次,以使用SFTP下载文件。计划的程序是用Perl编写的,使用的模块是Net::SFTP::Foreign。Net::SFTP::Foreign是否可以下载使用SFTP仅部分上传的文件?如果是,我们是否需要检查SFTP文件的修改日期以检查拷贝过程是否完成?假设有人在SFTP中上传了一个新文件,并且文件上传/复制正在进行中。如果同时尝试下载,我是否需要编写代码来实现只获取文件的一部分的可能性?
Net::SFTP::Foreign
uklbhaso1#
这不是您使用的SFTP * 客户端 * 的问题,这无关紧要,而是SFTP * 服务器 * 如何处理这种情况。某些SFTP服务器可能会锁定正在上载的文件,从而阻止您在上载过程中访问该文件。但大多数SFTP服务器(尤其是常见的OpenSSH SFTP服务器)不会锁定文件。对于这个问题没有通用的解决方案。检查时间戳或大小的变化可能对你有用,但它很难可靠。此问题有一些常见的解决方法:
有关实现此方法的示例,请参见(我的)文章Locking files while uploading / Upload to temporary file name。此外,某些FTP服务器内置了此功能。例如,ProFTPD及其HiddenStores指令。
HiddenStores
有关详细信息,请参阅我对SFTP file lock mechanism的回答。
k2arahey2#
当上传过程也在你的控制之下时,最简单的方法是使用临时名称上传文件(例如,foo-20170809.tgz.temp),一旦上传完成,就重命名(Net::SFTP::Foreign::put方法支持atomic选项,该选项可以完成此操作)。然后在下载端,过滤掉名称与临时文件对应的文件。无论如何,可以指示Net::SFTP::Foreign、get和rget方法恢复传递选项resume => 1的传输。此外,如果您对SFTP服务器具有完全SSH访问权限,则可以使用fuser或某些类似工具检查是否有其他进程仍在写入要下载的文件(但请注意,即使这样,如果存在某些网络问题,并且上传程序需要重新连接才能恢复传输,则文件也可能不完整)。
foo-20170809.tgz.temp
Net::SFTP::Foreign::put
atomic
get
rget
resume => 1
fuser
ffx8fchx3#
您可以检查文件的大小。1.连接到SFTP。1.检查文件大小。1.睡眠5/10秒。1.再次检查文件大小。1.如果大小未更改,则下载文件,如果大小更改,则执行步骤3。
3条答案
按热度按时间uklbhaso1#
这不是您使用的SFTP * 客户端 * 的问题,这无关紧要,而是SFTP * 服务器 * 如何处理这种情况。
某些SFTP服务器可能会锁定正在上载的文件,从而阻止您在上载过程中访问该文件。但大多数SFTP服务器(尤其是常见的OpenSSH SFTP服务器)不会锁定文件。
对于这个问题没有通用的解决方案。检查时间戳或大小的变化可能对你有用,但它很难可靠。
此问题有一些常见的解决方法:
有关实现此方法的示例,请参见(我的)文章Locking files while uploading / Upload to temporary file name。
此外,某些FTP服务器内置了此功能。例如,ProFTPD及其
HiddenStores
指令。有关详细信息,请参阅我对SFTP file lock mechanism的回答。
k2arahey2#
当上传过程也在你的控制之下时,最简单的方法是使用临时名称上传文件(例如,
foo-20170809.tgz.temp
),一旦上传完成,就重命名(Net::SFTP::Foreign::put
方法支持atomic
选项,该选项可以完成此操作)。然后在下载端,过滤掉名称与临时文件对应的文件。无论如何,可以指示
Net::SFTP::Foreign
、get
和rget
方法恢复传递选项resume => 1
的传输。此外,如果您对SFTP服务器具有完全SSH访问权限,则可以使用
fuser
或某些类似工具检查是否有其他进程仍在写入要下载的文件(但请注意,即使这样,如果存在某些网络问题,并且上传程序需要重新连接才能恢复传输,则文件也可能不完整)。ffx8fchx3#
您可以检查文件的大小。
1.连接到SFTP。
1.检查文件大小。
1.睡眠5/10秒。
1.再次检查文件大小。
1.如果大小未更改,则下载文件,如果大小更改,则执行步骤3。