2010-02-25 56 views
5

我正在开发一个与名为Dazzle的USPS运输包接口的系统。该系统的一部分包括一个监控守护进程,其目的是采用制表符分隔的值文件,将它们转换为Dazzle可识别的XML,并将它们传递给Dazzle以生成标签。这部分工作得很好。然而,我也想要解析Dazzle生成的输出文件并将其导入到数据库中。我的Linux守护进程如何知道Windows程序何时停止写入通过SAMBA访问的文件?

请注意,Dazzle在Windows上运行。我的监控守护进程是用Perl编写的,可以在Linux上运行。我的Linux系统通过Samba安装了Dazzle的输入和输出目录。

有时间的Dazzle开始写输出文件,它的完成时间之间的可测量的延迟。我想知道的是我如何等待Dazzle完成输出文件的写入?我试过打开这个文件,并在其上做了flock($fh, LOCK_SH),但这似乎没有任何好处。

编辑:我有一个基于下面的“mobrule”的评论的想法。 Dazzle使用XML编写输出文件。货件中的每个包装都包含在标签中,整个文件都包含在标签中。因此,如果我在文件完成之前开始阅读文件,则可以在采取措施之前等待适当的结束标记。

另外,我应该提到我目前正在做的事情。当我检测到输出XML文件已被创建时,我试图解析它。如果解析失败,我会睡觉并重试。如果失败了,我会睡两次,然后再试一次,等等。这在64秒超时测试中工作得很好。

回答

1

这可能不是一个很好的解决方案,但你可以尝试,如果它不能反复重命名文件,睡了一下。

1

你可以尝试做一个锁瓦特/ LOCK_EX - 如果锁定失败,这意味着它仍然被写入。像这样旋转直到你获得锁定,并应该完成炫目。如果Dazzle关闭文件并以w/append模式再次打开它,这将失败,所以它不是最好的解决方案。

+0

这只有在Dazzle也使用相同的锁定机制锁定文件时才成立。如果Dazzle不是Perl脚本,这种情况不太可能,尤其不太可能。 – mob 2010-02-25 16:05:57

+0

这是一个很好的观点 - Dazzle是一个Windows应用程序,不是用Perl编写的。因此,由于Perl中的文件锁定只是“建议性的”,所以不起作用。可惜,'否则这是我听到的最好的解决方案。 – 2010-02-27 13:51:05

1

也许你可以有炫写出一个虚拟或标记文件(它可以包含任何你想要像一个日期/时间戳或序列号),以表明炫已经写完的文件。然后你所做的就是测试这个文件的存在以知道它已经完成。

5

没有通用的可移植的方式来判断某个进程是否对某些任意文件有打开的文件句柄。你必须根据当地情况作出判断。

在这种情况下,有可能查询Windows计算机上的进程表,看是否“炫”程序仍在运行。或者,也许你的经验给了你其他的指导方针,如“Dazzle从不超过20秒运行,当输入合理”或“Dazzle运行时,它每隔几秒更新一次文件,如果文件没有更新比如说10秒,那么Dazzle完成的可能性很大。“

但是你不一定要等到Dazzle完成。在Dazzle写入文件的同时读取文件是完全正确的 - 请参阅the perldoc for the seek function,注意关于“如何模拟tail -f”的部分。然后,您可以在Dazzle运行时更新数据库。这样,如果你对Dazzle完成时猜测过于保守,你的数据库仍然会及时更新,唯一的代价是EOF文件句柄上的一些无用的seek和read调用。

+0

嗯,在Dazzle运行时,我实际上无法更新我的数据库,因为我正在从解析Dazzle的XML输出的结果更新我的数据库。虽然也许我可以找到解析器,或者编写我自己的简单解析器,但不需要完整的文档来开始解析。 – 2010-02-27 13:54:31