如何避免间歇性的Errno :: ETXTBSYexception?

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

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

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

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

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

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