我正在努力寻找发生这种情况的原因以及解决方案。
当我尝试在 Unix 目录上运行以下命令时,该目录包含大约 16 个文件,并且其中一个应用程序进程不断从同一目录中删除或重命名文件。当我调用该命令并且同时运行的应用程序进程从该位置移动一个或多个文件时,就会出现此问题。
ls -al |wc -l
ls: 'file_which_has_removed.txt': No such file or directory
我在触发 find 命令时也发现了同样的问题。
find . -maxdepth 1 -atime +15
/bin/find: '/u1/bruce/File_removed.txt': No such file or directory
ism 试图找到的解决方案是,有什么方法可以避免这个错误,_想运行这个 find 命令,然后使用 -delete 从目录中删除这些旧文件,而不停止应用程序进程。
答案1
在这两种情况下,您都会遇到竞争条件:
strace ls -l tmpdir/
[...]
openat(AT_FDCWD, "tmpdir/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 3
newfstatat(3, "", {st_mode=S_IFDIR|0755, st_size=34, ...}, AT_EMPTY_PATH) = 0
getdents64(3, 0x562392b64920 /* 8 entries */, 32768) = 200
statx(AT_FDCWD, "tmpdir/1.", AT_STATX_SYNC_AS_STAT|AT_SYMLINK_NOFOLLOW, STATX_MODE|STATX_NLINK|STATX [...]
lgetxattr("tmpdir/1.", "security.selinux", 0x562392b6c930, 255) = -1 ENODATA (Keine Daten verfügbar)
getxattr("tmpdir/1.", "system.posix_acl_access", NULL, 0) = -1 ENODATA (Keine Daten verfügbar)
首先,程序读取目录内容的名称列表。稍后会要求提供每个名称的详细信息。如果该对象同时被重命名,则会发生错误。