Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 我的Linux守护进程如何知道Windows程序何时停止写入我通过SAMBA访问的文件?_Perl_Samba_File Locking_Filelock - Fatal编程技术网

Perl 我的Linux守护进程如何知道Windows程序何时停止写入我通过SAMBA访问的文件?

Perl 我的Linux守护进程如何知道Windows程序何时停止写入我通过SAMBA访问的文件?,perl,samba,file-locking,filelock,Perl,Samba,File Locking,Filelock,我正在开发一个系统,该系统与一个名为Dazzle的USPS发货包进行接口。该系统的一部分包括一个监控守护进程,其目的是获取制表符分隔的值文件,将它们转换为Dazzle可以识别的XML,并将它们传递给Dazzle以生成标签。这部分很好用。然而,我还想做的是解析Dazzle生成的输出文件并将其导入数据库 请注意,Dazzle在Windows上运行。我的监控守护程序是用Perl编写的,在Linux上运行。我的Linux系统通过Samba安装了Dazzle的输入和输出目录 Dazzle开始写入输出文件到

我正在开发一个系统,该系统与一个名为Dazzle的USPS发货包进行接口。该系统的一部分包括一个监控守护进程,其目的是获取制表符分隔的值文件,将它们转换为Dazzle可以识别的XML,并将它们传递给Dazzle以生成标签。这部分很好用。然而,我还想做的是解析Dazzle生成的输出文件并将其导入数据库

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

Dazzle开始写入输出文件到完成之间有一个可测量的延迟。我想知道的是如何等待Dazzle完成输出文件的编写?我试着打开文件并对其执行
flock($fh,LOCK\u SH)
,但这似乎没有任何效果

编辑:我有一个想法是基于下面“MobleRule”的评论。Dazzle用XML编写输出文件。装运货物中的每个包装都附有标签,整个文件都附有标签。因此,如果我在文件完成之前就开始读取文件,我只需等待适当的结束标记,然后再采取行动


另外,我应该提到我目前正在做什么。当我检测到已创建输出XML文件时,我会尝试解析它。如果解析失败,我将休眠并重试。如果失败了,我会睡两倍的时间,然后再试一次,以此类推。这在64秒超时的测试中效果非常好。

这可能不是一个很好的解决方案,但您可以尝试重复重命名文件,如果失败,请休眠一段时间

您可以尝试使用lock\u EX执行一个锁,如果锁失败,这意味着它仍在被写入。像那样旋转,直到你得到锁,眩目应该完成。如果Dazzle关闭文件并以附加模式再次打开,则此操作将失败,因此这不是最佳解决方案。

也许您可以让Dazzle写出一个虚拟文件或标志文件(它可以包含任何您想要的内容,如日期/时间戳或序列号),以指示Dazzle已完成文件的编写。然后,您所要做的就是测试该文件是否存在,以确定它是否已完成。

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

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

但你不一定要等到炫目结束。在Dazzle写入文件的同时读取该文件是完全可以的——请参阅,注意“如何模拟
tail-f
”部分。然后,您可以在Dazzle运行时更新数据库


这样,如果您在猜测Dazzle何时完成时过于保守,您的数据库仍将及时更新,唯一的代价是在EOF对文件句柄进行一些无用的查找和读取调用。

只有Dazzle也使用相同的锁定机制锁定文件时,这才是正确的。如果Dazzle不是Perl脚本,这是不可能的,尤其是不可能的。这是一个很好的观点——Dazzle是一个Windows应用程序,不是用Perl编写的。因此,由于Perl中的文件锁只是“建议性”的,所以这是行不通的。遗憾的是,否则这就是我听到的最好的解决方案。好吧,在Dazzle运行时,我实际上无法更新我的数据库,因为我正在根据解析Dazzle的XML输出的结果更新我的数据库。虽然我可能会找到一个解析器,或者编写自己的普通解析器,但这并不需要文档完成就可以开始解析。