Invece di cat
devi usare touch
(o qualcosa che forza una scrittura), o dichiarando esplicitamente atime
nell'opzione di montaggio.
Ubuntu usa relatime
come predefinito. Il kernel di Linux, infatti, utilizza relatime
come impostazione predefinita dalla versione 2.6.30 in poi. Questo aggiorna solo determinati valori quando si accede ai file anziché a tutti. Questo modifica il cat
comportamento in modo che non aggiorni l'ora di accesso. Questa è l'impostazione predefinita nelle opzioni di montaggio di Ubuntu. L'unico modo per modificare il tempo di accesso è toccare il file (ovvero forzare una scrittura) invece di una semplice lettura.
La ragione di questo è la performance. Se ogni lettura richiede una scrittura come richiede POSIX, l'efficienza dei dischi e dei dispositivi basati su flash sarà peggiore. Questo sembra anche controproducente nei filesystem di sola lettura.
Ci sono molte discussioni su questo argomento in Ask Ubuntu e Super User:
- https://askubuntu.com/q/2099/169736
- https://superuser.com/q/464290/235569
Ci sono 3 opzioni di montaggio di cui generalmente devi essere a conoscenza quando hai a che fare con atime
. Hai familiarità con i primi 2, dalla pagina man di mount
estratti
atime Do not use noatime feature, then the inode access time is controlled
by kernel defaults. See also the description for strictatime and
relatime mount options.
noatime
Do not update inode access times on this filesystem (e.g., for
faster access on the news spool to speed up news servers).
L'altra opzione con cui probabilmente non hai familiarità e quella che causa il tuo dolore è questa, che è stata l'impostazione predefinita dal kernel 2.6.30:
relatime
Update inode access times relative to modify or change time.
Access time is only updated if the previous access time was
earlier than the current modify or change time. (Similar to
noatime, but doesn't break mutt or other applications that need to
know if a file has been read since the last time it was
modified.)
Since Linux 2.6.30, the kernel defaults to the behavior provided
by this option (unless noatime was specified), and the
strictatime option is required to obtain traditional semantics. In
addition, since Linux 2.6.30, the file's last access time is
always updated if it is more than 1 day old.
Puoi controllare se queste opzioni sono impostate su un filesystem guardando sotto /proc/mounts
.
Esempio
$ head -5 /proc/mounts
rootfs / rootfs rw 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=3976812k,nr_inodes=994203,mode=755 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
La differenza con relatime
contro noatime
è che apporterà modifiche, ma solo quando l'ora di accesso corrente è successiva all'ora di accesso precedente.
L'ora di accesso viene aggiornata solo se l'ora di accesso precedente era precedente all'ora di modifica o modifica corrente. (Simile a noatime, ma non interrompe mutt o altre applicazioni che devono sapere se un file è stato letto dall'ultima volta che è stato modificato.)