unix ディレクトリで find または ls -al を使用すると、そのファイルまたはディレクトリエラーはありません。

unix ディレクトリで find または ls -al を使用すると、そのファイルまたはディレクトリエラーはありません。

なぜこれが起こり、解決策が何であるのかを理解しようとしています。

Unixディレクトリで次のコマンドを実行しようとすると、そのディレクトリに約16個のファイルが含まれており、アプリケーションプロセスの1つが同じディレクトリからファイルを削除または名前変更し続けています。この問題は、コマンドを呼び出し、同時に実行されているアプリケーションプロセスがその場所から1つ以上のファイルを移動したときに発生します。

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

私が探している解決策は、このエラーを回避する方法はありますか?この 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)

まず、プログラムはディレクトリの内容の名前のリストを読み込みます。各名前の詳細については、今後要求される予定です。同時にオブジェクト名を変更するとエラーが発生します。

関連情報