Поиск самого последнего записанного файла (Unix): найти, что появляется "не совсем достаточно" - PullRequest
1 голос
/ 22 декабря 2011

Я выполнил следующую команду:

find . -type f | xargs ls -ltrhg

Чтобы получить последний записанный файл во время работы программы.

Результат был странным: в нижней части списка я получил последние файлы, но отсутствовал САМЫЙ ОЧЕНЬ недавно созданный файл ... То есть для проверки я непосредственно запустил

touch asdf

с последующим

find . -type f | xargs ls -ltrhg

пока asdf был не самым последним.

Есть мысли о том, почему эта команда, кажется, игнорирует последний записанный файл, но возвращает несколько сотен файлов в правильном порядке, в котором они были отредактированы?

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

Программы в конечном итоге вызывают write () при записи в файл. запись не приводит к немедленной записи на диск.

Если ваша программа не вызывает fdatasync () или один из ее двоюродных братьев, таких как fflush (), данные остаются в буферах ядра до тех пор, пока ядро ​​не решит поместить данные на диск. Вы можете записать кучу данных в файл без начала физической записи на диск. Это особенность производительности. Дисковый ввод / вывод очень медленный по сравнению с доступом к памяти.

Это означает, что на практике ваша программа может найти другие файлы на диске, более новые, чем тот, который она записывает в настоящее время.

1 голос
/ 05 января 2012

Проблема, вероятно, в том, что существует так много файлов, что xargs разбивает их на несколько вызовов ls.

(Я сомневаюсь, что проблема в кеш-буфере. Если это не какая-то экзотическая распределенная версия Unix, find, xargs и ls должны читать и записывать один и тот же буферный кеш.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...