我正在编写一个应用程序,它将文件放在已通过SFTP上传的特定目录中并将其移至S3。
我有一个问题,我的cron作业在没有完全上传时开始上传文件。我已经想到了尝试等待文件完成的各种方法,但我无法知道(我知道)。
我希望SO的集体天才能够对此有所了解!
答案 0 :(得分:2)
有很多方法可以解决这个问题:
更改上传过程以上传数据文件本身(例如,data.txt),然后上传sentinel文件(例如,data.txt.sentinel)。然后在处理数据文件之前等待标记并删除它们。数据文件早于N天,没有相应的标记 - 只需删除它们。只有在您可以更改上传器时才会这样做。
如果您可以评估文件的内容以检查完整性,这是另一种方法。例如,如果您只上传HTML文件,则可以检查它是否以</html>
结尾。除非您可以控制上传的内容,否则并非总是可行。
未经修改的for-a-while方法。基本上,如果文件没有被修改N分钟,您可以假设上传已经完成。这可能仍会导致处理传输失败的不完整文件。
所有这些方法都有其优点和缺点,您必须决定哪种方法最适合您。我们尝试选择数字1,我们可以影响上传方。
请记住,N在上述场景中是可配置的。你需要平衡一个太小的N会导致你在选项3中处理一个不完整的文件但是太大的N值会延迟处理所述文件的可能性。
答案 1 :(得分:0)
有什么办法可以在SFTP转移后添加一个步骤吗?我们的想法是将文件SFTP到临时目录,然后一旦完成就有相同的客户端执行(通过SSH)脚本到mv
文件到cron作业正在查看的目录。 mv
在许多本地Unix文件系统上是原子的,因此cron作业只会看到旧文件或新文件。
当然,如果您可以在SFTP传输后执行脚本,您可以让脚本执行传输到S3,而不使用cron作业;)
答案 2 :(得分:0)
我们使用pure-ftpd进行非常类似的过程。而不是让cron作业执行上传,我们使用pure-ftp的上传脚本选项,每次上传完成时触发脚本。如果ftp服务器可以使用,可以考虑使用类似的机制。