Вопрос или проблема
Второй вызов команды cat для отображения файла не обновляет время доступа. Я ожидал, что время доступа будет обновляться каждый раз, когда содержимое файла отображается.
Я наблюдаю то же самое поведение, если открываю файл в веб-браузере. Время доступа не обновляется последовательно.
Я неправильно понимаю время доступа? Чем отличаются два вызова cat?
$ touch test $ stat test Файл: `test' Размер: 0 Блоки: 0 IO Блок: 4096 обычный пустой файл Устройство: 803h/2051d Идентификатор: 152694 Ссылки: 1 Доступ: (0664/-rw-rw-r--) Uid: ( 1001/ aaron) Gid: ( 1001/ aaron) Доступ: 2012-08-21 11:05:40.586020996 +0200 Изменение: 2012-08-21 11:05:40.586020996 +0200 Изменение: 2012-08-21 11:05:40.586020996 +0200 Создание: - $ vim test $ stat test Файл: `test' Размер: 5 Блоки: 8 IO Блок: 4096 обычный файл Устройство: 803h/2051d Идентификатор: 152694 Ссылки: 1 Доступ: (0664/-rw-rw-r--) Uid: ( 1001/ aaron) Gid: ( 1001/ aaron) Доступ: 2012-08-21 11:05:52.890021630 +0200 Изменение: 2012-08-21 11:06:31.606023626 +0200 Изменение: 2012-08-21 11:06:31.638023629 +0200 Создание: - $ cat test test $ stat test Файл: `test' Размер: 5 Блоки: 8 IO Блок: 4096 обычный файл Устройство: 803h/2051d Идентификатор: 152694 Ссылки: 1 Доступ: (0664/-rw-rw-r--) Uid: ( 1001/ aaron) Gid: ( 1001/ aaron) Доступ: 2012-08-21 11:06:44.662024298 +0200 Изменение: 2012-08-21 11:06:31.606023626 +0200 Изменение: 2012-08-21 11:06:31.638023629 +0200 Создание: - $ cat test test $ stat test Файл: `test' Размер: 5 Блоки: 8 IO Блок: 4096 обычный файл Устройство: 803h/2051d Идентификатор: 152694 Ссылки: 1 Доступ: (0664/-rw-rw-r--) Uid: ( 1001/ aaron) Gid: ( 1001/ aaron) Доступ: 2012-08-21 11:06:44.662024298 +0200 Изменение: 2012-08-21 11:06:31.606023626 +0200 Изменение: 2012-08-21 11:06:31.638023629 +0200 Создание: -
http://en.wikipedia.org/wiki/Stat_(system_call)
Запись в файл изменяет его mtime и ctime, в то время как чтение файла изменяет его atime. В результате, на системе, совместимой с POSIX, чтение файла вызывает запись, что подвергается критике. Это поведение обычно можно отключить, добавив параметр монтирования в /etc/fstab.
Тем не менее, отключение обновления atime нарушает совместимость с POSIX, и некоторые приложения, в частности, почтовый читатель mutt (в некоторых конфигурациях), а также некоторые утилиты для отслеживания использования файлов, в частности, tmpwatch. В худшем случае, отсутствие обновления atime может вызвать сбои у некоторых программ резервного копирования при попытке сделать резервную копию файла.
Разработчик ядра Linux Инго Молнар назвал atime “возможно, самой глупой идеей дизайна Unix за все времена”, добавив: “[Д]умайте об этом немного: ‘Для каждого файла, который читается с диска, давайте сделаем … запись на диск! И для каждого файла, который уже закеширован и который мы читаем из кеша … сделаем запись на диск!'” Он также выделил влияние на производительность следующим образом:
Обновления atime являются, безусловно, самой большой недостатком производительности ввода-вывода, с которым сталкивается Linux сегодня. Избавление от обновлений atime дало бы нам больше повседневной производительности Linux, чем все ускорения pagecache за последние 10 лет, вместе взятые.
как узнать, является ли noatime или relatime параметром монтирования по умолчанию в ядре?
man mount
....
relatime
Обновляет время доступа inode относительно времени изменения или изменения.
Время доступа обновляется только в том случае, если предыдущее время доступа было раньше, чем текущее время изменения или изменения. (Похоже на noatime, но не нарушает работу mutt или других приложений, которым нужно знать, был ли файл прочитан с последнего изменения.)
Начиная с Linux 2.6.30, ядро по умолчанию использует поведение, предусмотренное этой опцией (если не был указан noatime), и параметр strictatime необходим для получения традиционной семантики. Кроме того, начиная с Linux 2.6.30, последнее время доступа к файлу всегда обновляется, если оно старше 1 дня.
....
Вот почему этот конкретный раздел был смонтирован и почему cat не обновляет время доступа, как я ожидал.
Ответ или решение
Почему команда cat
не обновляет время доступа файла?
Вопрос о том, почему время доступа (atime) не обновляется при повторном вызове команды cat
для вывода содержимого файла, имеет несколько технических аспектов. Давайте рассмотрим их подробно.
Понимание времени доступа (atime)
Время доступа (atime) — это временная метка, которая отображает время последнего доступа к файлу. Согласно стандартам POSIX, проверка чтения файла должна обновлять это время. В вашем случае, вы заметили, что при повторном вызове cat
время доступа остается неизменным. Давайте разберем возможные причины такой ситуации.
Опции монтирования файловой системы
Существует ряд опций, которые можно применить при монтировании файловых систем, и они влияют на обновление временных меток. К наиболее важным относятся:
-
noatime – при использовании этой опции время доступа вообще не обновляется, что может значительно повысить производительность, особенно на системах с высокой нагрузкой.
-
relatime – это более сбалансированный вариант, который обновляет время доступа только если оно более старое, чем время последнего изменения (mtime) или изменения метаданных (ctime). Это поведение стало стандартным в ядре Linux с версии 2.6.30, если не указана опция noatime.
Судя по вашему описанию, вероятно, ваш раздел файловой системы был смонтирован с опцией relatime
, поэтому время доступа обновляется не для каждого чтения файла, а только при определенных условиях.
Поведение cat
и браузеров
Когда вы используете команду cat
для чтения файла, система должна обновить atime, если это разрешено настройками монтирования. Однако, если вы вызываете cat
дважды подряд, система может не обновить atime, если последний доступ уже происходит после последнего изменения файла (в данном случае времени mtime).
Веб-браузеры также могут использовать кэширование, чтобы избежать постоянных обращений к файловой системе, что может привести к аналогичному поведению. Если браузер визуализирует файл, он может обращаться к кэшу, и, соответственно, не выполнять чтение файла с диска, что также препятствует обновлению времени доступа.
Заключительные мысли
Для достижения привычного вам поведения может потребоваться изменить опции монтирования файловой системы. Если вам действительно нужно, чтобы atime обновлялся с каждым чтением файла, рассмотрите возможность применения опции strictatime
, но будьте готовы к возможному ухудшению производительности.
Таким образом, отсутствие обновления времени доступа при повторном вызове команды cat
является не ошибкой, а следствием настройки вашей файловой системы. Понимание поведения и возможностей монтирования может помочь вам лучше управлять вашей системой и ожиданиями от работы с файлами.