我正在开发一个与名为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秒超时测试中工作得很好。
这只有在Dazzle也使用相同的锁定机制锁定文件时才成立。如果Dazzle不是Perl脚本,这种情况不太可能,尤其不太可能。 – mob 2010-02-25 16:05:57
这是一个很好的观点 - Dazzle是一个Windows应用程序,不是用Perl编写的。因此,由于Perl中的文件锁定只是“建议性的”,所以不起作用。可惜,'否则这是我听到的最好的解决方案。 – 2010-02-27 13:51:05