可靠的文件复制(移动)过程 – 主要是Unix / Linux

小故事:我们需要一个坚如磐石的可靠的文件传送程序。 我们有经常被写入到我们需要从中移动文件的源代码目录。 这些文件是成对的 – 一个大的二进制文件和一个小的XML索引。 我们得到一个定义这些文件包的CTL文件。 一旦它们在目的地目录中,就有一个操作文件的过程; 当它完成的时候摆脱它们。 rsync会做最好的工作,还是我们需要变得更复杂? 长话如下:

我们有很多来源:一组目录在一台Windows机器上(有Cygwin和SSH守护进程),一整套目录在一组SFTP服务器上(其中大多数也是Windows)。我们的目的地是AIX服务器上的目录列表。

我们曾经在Windows / Cygwin机器上使用非常可靠的Perl脚本,这是我们唯一的来源。 但是,我们正在努力摆脱这台机器,现在还有其他的资源,SFTP服务器,我们目前无法运行我们自己的脚本。

出于安全原因,我们无法在AIX服务器上运行复制作业 – 他们无法访问源服务器。 我们目前在Linux机器上有一个本地Java程序,它使用SFTP从各种新的SFTP源目录中提取,复制到本地tmp目录,validation是否存在,然后将其复制到AIX机器,然后删除这些文件从源头上。 但是,我们发现了任何数量的错误或错误检查处理不当。 我们都不是Java专家,所以修复/改进这可能是困难的。

对我们的关注是:

  • 使用远程源(SFTP),rsync会独自保留正在写入的任何文件吗? 其中一些文件很大。
  • 从阅读文档看来,似乎rysnc将是非常好的,直到目的地被可靠的书面去除源。 有没有人有经验确认或否认这一点?
  • 附加信息我们将关注一旦它们在目标目录中的文件上的操作过程。 当我们正在复制文件时,我们不希望它在文件上运行; 它将一直等到小XML索引文件存在。 我们目前的复制工作应该是最后复制XML文件。
  • 有时候networking有问题,有时候SFTP源服务器会让我们失望。 有时我们inputconfiguration文件,目标目录不存在。 由于这种错误,我们从不想丢失文件。
  • 我们需要好的日志

如果你被提出这个,你会只是编写一些rsync? 或者你会build立或购买一个工具,如果是这样的话,它将会是什么样的(或者它将使用什么技术?)我(和我的团队中的其他人)在Perl上体面。

编辑: Rsync做一个端到端的检查:文件被传输后,它计算目标文件的校验和,并将其与源的校验和进行比较。 当校验和匹配时,只有它宣布传输成功。 这反映在最终退出状态代码中 – 如果所有被转移的文件都通过了testing,则退出代码将为0(成功)。

在类似的设置中,我编写了基于rsync的自己的解决scheme。 这是夜间备份,我们不会自动删除文件。

为了解决您的一些担忧:

  • Rsync从不修改源端的任何内容(除非使用--remove-source-files选项)。
  • 如果networking长时间closures,Rsync将放弃并给出适当的退出状态 。 我检查我的脚本和特定的退出代码(我通过日志logging在实践中观察到)我有脚本重新尝试rsync命令最多3次。
  • 是的,你的脚本应该尽可能地logging下来。 时间戳,总运行时间,Rsync存在状态,Rsync –stats输出(传输量)。 我也在传输结束时运行find来计算文件数目和du *来获取目录和日志的大小。

基本上你需要在脚本中处理一些事情。 主要是:收集退出状态,一些统计信息,并删除成功传输的源文件。

您可以信任rsync的退出状态,即所有请求的文件都被转移,但是您应该考虑您在源计算机上删除它们之前是否信任脚本,以便为rsync提供正确的文件(源目录)。 也许在源文件和目标文件上find文件(然后检查这些数字是否匹配)将是一个很好的最终检查,然后脚本会自动删除这些文件。

给它10到20次尝试开发和testing你的脚本。 您需要在Windows机器上安装Cygwin和rsync和ssh客户机。

通过了解它是如何工作的,对这样的应用程序感到很自信。 我从来没有使用过商业备份软件 – 但是如果你能find一个坚实的备份软件并相信它 – 那就去做 – 这可以为你节省很多时间。