如何避免间歇性的Errno :: ETXTBSY异常?

时间:2013-03-20 01:08:55

标签: ruby-on-rails ruby

在Rails应用程序中的部分请求中,我将目录从一个地方复制到另一个地方,将其视为工作区域。有时,此复制操作会导致抛出“Errno :: ETXTBSY”异常。我似乎无法确定导致它的案例,检测案件的任何提示或完全避免它?

我已确定目标目录是唯一命名的,因此不应该是2个进程尝试写入同一位置的情况。除此之外,我没有想法。

1 个答案:

答案 0 :(得分:2)

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

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

您尚未发布任何代码,因此很难具体评论。我建议您添加足够的日志记录,以便准确了解正在处理的文件,特别是抛出异常的源和目标路径。然后,您可以使用lsof查看该文件打开的进程。

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