O tempo de acesso a arquivos não está sendo atualizado no Ubuntu 12.04

4

Depois de usar o comando cat para ler um arquivo, usei o comando stat para ver o tempo de acesso alterado, mas ele não está sendo atualizado.

Eu verifiquei o arquivo /etc/fstab e não há noatime em nenhuma das minhas unidades, então por que o tempo de acesso não está sendo atualizado?

Estou usando o Pangolim Preciso do Ubuntu 12.04.

    
por Cody 08.12.2013 / 12:09

2 respostas

5

Em vez de cat , você deve usar touch (ou algo que force uma gravação) ou declarar explicitamente atime em sua opção de montagem.

O Ubuntu usa relatime como padrão. O kernel do Linux, de fato, usa relatime como o padrão da versão 2.6. 30 em diante . Isso atualiza apenas determinados valores quando os arquivos são acessados em vez de todos. Isso modifica o comportamento cat para que não atualize o tempo de acesso. Este é o padrão nas opções de montagem do Ubuntu. A única maneira de modificar o tempo de acesso é tocar o arquivo (também conhecido como forçar uma gravação) em vez de uma simples leitura.

A razão por trás disso é o desempenho. Se cada leitura exigir uma gravação, conforme exigido pelo POSIX, a eficiência dos discos e dos dispositivos baseados em flash será pior. Isso também parece contraproducente em sistemas de arquivos somente leitura.

Há um monte de discussões sobre este tópico em Ask Ubuntu e Super User:

por 08.12.2013 / 13:16
3

Existem 3 opções de montagem das quais você geralmente deve estar ciente ao lidar com atime . Você está familiarizado com os dois primeiros, da página man do monte

trechos

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).

A outra opção com a qual você provavelmente não está familiarizado, e a que está causando seu luto é essa, que foi o padrão desde o 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.

Você pode verificar se essas opções estão definidas em um sistema de arquivos, procurando em /proc/mounts .

Exemplo

$ cat /proc/mounts  | head -5
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

A diferença com relatime vs. noatime é que ele fará alterações, mas somente quando o tempo de acesso atual for posterior ao tempo de acesso anterior.

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.)

    
por 08.12.2013 / 18:11