0

在 Rails 应用程序中的部分请求期间,我将目录从一个地方复制到另一个地方,将其视为一个工作区。有时,此复制操作会引发“Errno::ETXTBSY”异常。我似乎无法确定导致它的案例,有什么提示可以发现或完全避免它?

我已经确保目标目录是唯一命名的,所以它不应该是 2 个进程尝试写入同一个地方的情况。除此之外,我没有想法。

4

1 回答 1

2

ETXTBSY 表示您正在尝试打开以写入当前正在作为程序执行的文件,或者您正在尝试执行当前正在打开以进行写入的文件。既然您说您正在复制文件,而不是执行它们,那么它似乎很可能是前者,而不是后者。

您说您的目标是一个独特的新目标,但我的猜测是这并不完全正确,您实际上是针对现有目录,并且您尝试覆盖的文件之一当前作为正在运行的可执行文本段打开过程。

您还没有发布任何代码,因此很难具体评论。我建议您添加足够的日志记录,以便您确切知道正在处理哪些文件,特别是引发异常的源和目标路径。然后您可以使用lsof查看哪个进程可能会打开该文件。

如果要覆盖当前打开的可执行文件,避免该问题的一种方法是首先unlink访问目标文件。正在运行的进程仍将映射旧的 inode 并使用已删除的文件愉快地继续,但您的 open for write 将创建一个不会冲突的新文件。

于 2013-03-20T02:48:06.800 回答