我有一个连续轮询文件夹的应用程序。一旦任何文件ftp到文件夹,应用程序必须将此文件移动到其他文件夹进行处理。
在这里,我们没有任何选项可以验证ftp是否完整。
技术论坛中建议使用一个命令“lsof”。它有一个文件描述列,它给出了文件状态。
因为这是一个免费的bsd命令,并且在旧版本的linux中没有,我想澄清一下这个命令的用法。
您能告诉我们您在文件验证方面的经验吗?还有其他替代解决方案吗?
此外,使用此实用程序有任何风险吗?
提前感谢您的帮助。
谢谢, Mathew Liju
答案 0 :(得分:4)
我们之前已经以多种不同的方式完成了这项工作。
方法一:
如果您可以控制发送文件的过程,请让它自己发送文件后跟一个sentinel文件。例如,发送真实文件"contracts.doc"
,后跟一个字节"contracts.doc.sentinel"
。
然后让你的监听程序进程注意sentinel文件。当创建其中一个时,您应该处理等效数据文件,然后删除它们。
任何超过一天且没有相应的sentinel文件的数据文件,摆脱它 - 这是一个失败的传输。
方法二:
密切关注文件本身(特别是最后修改日期/时间)。仅处理过去修改时间超过N
分钟的文件。这会增加处理文件的延迟,但您通常可以确定,如果文件未在五分钟内写入(例如),则已完成。
结论:
这些方法过去都成功地被我们使用过。我更喜欢第一个,但是当我们不允许更改发送文件的过程时,我们不得不使用第二个。
第一个优点是,当发送sentinel文件时,知道文件已准备就绪。使用lsof
(我假设您正在处理任何进程未打开的文件已准备好处理)和时间戳,FTP可能在中间崩溃,您可能正在处理半个文件。
答案 1 :(得分:1)
通常有三种解决此类问题的方法。
lsof
可能是一个选项。如果你使用它,请注意-F选项,它格式化适合其他程序处理的输出,而不是人类可读的。
编辑:Pax确定了我忘记的第四种(!)方法 - 使用文件的时间戳在一段时间内没有更新的事实。
答案 2 :(得分:0)
有第五种方法。您还可以检查FTP会话是否仍处于活动状态。如果每个对等方拥有自己的ftp用户帐户,这将有效。只要用户没有从FTP注销,就假定文件不完整。