【问题标题】:Verify whether ftp is complete or not?验证ftp是否完整?
【发布时间】:2010-11-15 17:34:26
【问题描述】:

我有一个应用程序不断轮询文件夹。一旦任何文件被 ftp 到文件夹,应用程序必须将此文件移动到其他文件夹进行处理。

在这里,我们没有任何选项来验证 ftp 是否完整。

技术论坛建议使用一个命令“lsof”。它有一个文件描述列,提供文件状态。

由于这是一个免费的 bsd 命令,并且在旧版本的 linux 中不存在,所以我想澄清一下这个命令的用法。

您能告诉我们您在文件验证方面的经验吗?还有其他替代解决方案吗?

另外,使用这个工具有什么风险吗?

提前感谢您的帮助。

谢谢, 马修·李菊

【问题讨论】:

    标签: ftp lsof


    【解决方案1】:

    我们以前曾以多种不同的方式做到这一点。

    方法一:

    如果您可以控制发送文件的进程,请让它发送文件本身,然后发送一个哨兵文件。例如,发送真实文件"contracts.doc",后跟一个字节的"contracts.doc.sentinel"

    然后让您的侦听器进程注意哨兵文件。创建其中一个时,您应该处理等效的数据文件,然后将两者都删除。

    任何超过一天的数据文件并且没有相应的标记文件,删除它 - 这是一个失败的传输。

    方法二:

    密切关注文件本身(特别是最后修改日期/时间)。仅处理过去修改时间超过N 分钟的文件。这会增加处理文件的延迟,但您通常可以确定,如果一个文件在五分钟内没有被写入(例如),它就完成了。

    结论:

    我们过去已经成功地使用了这两种方法。我更喜欢第一个,但是当我们不允许更改发送文件的过程时,我们不得不使用第二个。

    第一个的好处是当哨兵文件出现时你知道文件已经准备好了。使用lsof(我假设您正在将任何进程未打开的文件视为准备好处理)和时间戳,FTP 可能在中间崩溃并且您可能正在处理半个文件。

    【讨论】:

    • 谢谢帕克斯。我们对第一种方法有类似的问题,因为企业不想改变流程。我决定采用第二种方法。
    【解决方案2】:

    这类问题通常有三种方法。

    1. 提供信号文件,以便在传输文件时发送附加文件以标记传输完成
    2. 在该目录中的日志文件中添加一个条目以指示传输已完成(这仅在您有单个对等方更新目录时才有效,以避免并发问题)
    3. 解析文件以确定完整性。例如文件是否以长度字段开头,还是明显不完整?例如由于缺少结束元素,解析不完整的 XML 文件将导致解析错误。根据文件的大小和格式,这可能很简单,也可能非常耗时。

    lsof 可能是一个选项,尽管您已经确定了您的 Linux 可移植性问题。如果您使用它,请注意 -F 选项,该选项将输出格式化为适合其他程序处理,而不是人类可读。

    编辑:Pax 确定了我忘记的第四个(!)方法 - 使用文件的时间戳在一段时间内没有更新的事实。

    【讨论】:

    • 感谢布赖恩的评论。但是输入文件解析是一项繁琐的任务,因为它是格式化的,业务不会同意改变流程。
    【解决方案3】:

    还有第五种方法。您还可以检查 FTP 会话是否仍处于活动状态。如果每个对等点都有自己的 ftp 用户帐户,这将起作用。只要用户没有从 FTP 注销,就假定文件不完整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多