Perl:system命令在完成之前返回

Perl:system命令在完成之前返回,perl,Perl,我在Linux上运行的perl脚本中使用了一些system()命令 我使用system()函数运行的命令将数据输出到日志中,然后我对日志进行解析,以决定下一步要做什么。 我注意到,有时解析日志文件的代码(在system()函数之后出现)似乎没有使用最终的日志 例如,我在日志文件中搜索一个“测试通过”短语,而脚本没有找到它,即使当我打开日志时它也在那里 另一个例子-我尝试删除日志所在的文件夹,但它不允许我删除,因为它“不是空的”。当我尝试手动删除它时,它会被错误删除 (这些例子时不时发生,但大多数

我在Linux上运行的perl脚本中使用了一些
system()
命令

我使用
system()
函数运行的命令将数据输出到日志中,然后我对日志进行解析,以决定下一步要做什么。 我注意到,有时解析日志文件的代码(在
system()
函数之后出现)似乎没有使用最终的日志

例如,我在日志文件中搜索一个“测试通过”短语,而脚本没有找到它,即使当我打开日志时它也在那里

另一个例子-我尝试删除日志所在的文件夹,但它不允许我删除,因为它“不是空的”。当我尝试手动删除它时,它会被错误删除

(这些例子时不时发生,但大多数情况下并非如此)


在我看来,这似乎是某种“时间”问题。如何解决此问题?

如果您希望安全并且使用Linux,请调用
系统同步操作。这将迫使操作系统将仍然缓冲的所有内容写入文件系统,并仅在之后返回。因此,您可以确定,当它完成时,您现在写入文件的所有内容实际上都已经到达了那里

但请注意,在许多情况下,这可能是过分的。这些缓冲区是有原因的,经常手动调用
sync
很可能不是实现目标的最快方式。另见

例如,如果你在写作和阅读之间还有其他事情可以做,比如一些计算或其他什么,那就足够了,你也不会浪费时间告诉操作系统你更了解如何以及何时必须完成它的工作^^


但如果您主要关心的不是完美的效率(如果是的话,您不应该使用Perl),
系统同步在所有修改文件之后和访问这些文件之前可能都是安全的。

计时,你是说缓冲?如何“手动删除错误”?事实上,您应该显示生成所描述行为的代码。否则,我们所能做的就是猜测。听起来,当脚本试图继续时,命令的输出还没有正确写入。最有可能的是,它仍然在它进入硬盘时必须经过的众多缓冲区中的一个缓冲区中。您可能可以通过睡眠几毫秒来解决这个问题,或者,如果您想在Linux系统上强制执行,在第一次
系统
之后插入
系统同步
,以刷新文件系统。@DeVadder您所说的听上去与问题完全一样,而且很可能是解决方案。我应该只使用一次吗?使用什么类型的命令来生成日志?可能是日志生成器分叉,而您使用
system()
调用的进程在其所有子进程终止之前终止。我仍然面临这个问题。这种情况很少发生,但仍然时不时发生。在我继续脚本之前,有没有办法确保所有缓冲区都已完成编写?嗯,我不知道为什么会发生这种情况。它可能像Stefan Majewsky在评论中建议的那样,也可能与实际磁盘写入文件的功能有关。硬盘确实有自己的缓冲区,但我相信它们对你来说应该是透明的。不管怎样,如果你不想深陷其中,我建议你在写完文章后再睡一会儿,如果你可能的话。如果问题仍然存在,则很可能不是由于写入磁盘的速度太慢,因为写入磁盘的速度永远不会那么慢,但可能与日志的生成方式有关。