为什么有时候读取文件,atime不更新

在linux中,使用stat foo.txt 命令可以看到文件foo.txt的三个时间:

atime:access time,访问时间

mtime:modify time,修改时间,文件内容有修改

ctime:change time,create time,改变时间,文件的索引节点发生变化,具体的情况有:1、文件内容有修改;2、文件权限有修改;3、inode变了;4、重命名(重命名不会导致inode改变)

PS:

1、如果用vi去修改某个文件,可能会发现这三个时间都被更新了,因为vi使用了临时文件保存修改,在wq时替换了原来的文件,导致文件的inode被改变了,可以用ls -li验证一下

2、如果想修改mtime,可以echo "hello world" >> foo.txt,注意ctime也会跟着改变

3、如果想仅仅修改ctime,可以chmod 644 foo.txt,mtime不会改变

4、为什么没说atime呢,不是想象中的那么简单的,后面详细分析

 

对于一个文件foo.txt

ls -l foo.txt 显示的是mtime

ls -l -c foo.txt 显示的是ctime

ls -l -u foo.txt 显示的是atime

 

对于atime,当你以为cat foo.txt然后stat foo.txt能看到atime改变的话,很可能就会失望了,并不是每次atime都会改变的

atime和mount的参数以及内核有关:

 

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

       norelatime
              Do not use relatime feature. See also the strictatime mount option.

       strictatime
              Allows to explicitly requesting full atime updates. This makes it pos‐
              sible  for  kernel  to defaults to relatime or noatime but still allow
              userspace to override it. <span style="color:#ff0000;">For more details about  the  default  system
              mount options see /proc/mounts</span>.

       nostrictatime
              Use the kernel's default behaviour for inode access time updates.

如果使用noatime,那么atime就不会被更新,即使修改了文件内容

如果使用atime,采用内核默认行为,kernel2.6.30后就相当于使用了relatime

如果使用relatime,表示当atime比ctime或mtime更早,然后你又去读取了文件,atime才会被更新为当前时间,kernel2.6.30后的默认行为;或者atime比现在早一天,那么atime在文件读取时会被更新

如果使用strictatime,atime在文件每次被读取时,都能够被更新

cat /proc/mounts可以看到我的服务器使用的是relatime参数: 

/dev/sdl1 /home ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0

  

实验环节:

noatime,可以看到不管是修改文件还是读取文件,atime都不会变化,性能最好

shuyin.wsy@localhost:~$ sudo mount -t tmpfs -o noatime tmpfs /mnt
shuyin.wsy@localhost:~$ cd /mnt
shuyin.wsy@localhost:/mnt$ echo "hello world" >> foo.c
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 12              Blocks: 8          IO Block: 4096   regular file
Device: 18h/24d Inode: 60855528    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 17:46:19.734162324 +0800 #最初值
Modify: 2016-04-11 17:46:19.734162324 +0800
Change: 2016-04-11 17:46:19.734162324 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ echo "hello world" >> foo.c
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 24              Blocks: 8          IO Block: 4096   regular file
Device: 18h/24d Inode: 60855528    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 17:46:19.734162324 +0800 #写文件后,atime不变
Modify: 2016-04-11 17:46:38.142096924 +0800
Change: 2016-04-11 17:46:38.142096924 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ cat foo.c
hello world
hello world
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 24              Blocks: 8          IO Block: 4096   regular file
Device: 18h/24d Inode: 60855528    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 17:46:19.734162324 +0800 #读文件后,atime不变
Modify: 2016-04-11 17:46:38.142096924 +0800
Change: 2016-04-11 17:46:38.142096924 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ cd
shuyin.wsy@localhost:~$ sudo umount /mnt

 

relatime,当atime早于或等于mtime/ctime时,才会被更新,2.6.30后的内核的默认行为,性能和atime更新折中的选择

shuyin.wsy@localhost:~$ sudo mount -t tmpfs -o relatime tmpfs /mnt
shuyin.wsy@localhost:~$ cd /mnt
shuyin.wsy@localhost:/mnt$ echo "hello world" >> foo.c
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 12              Blocks: 8          IO Block: 4096   regular file
Device: 19h/25d Inode: 60855680    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 17:51:44.772736377 +0800 #最初值
Modify: 2016-04-11 17:51:44.772736377 +0800
Change: 2016-04-11 17:51:44.772736377 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ cat foo.c > /dev/null
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 12              Blocks: 8          IO Block: 4096   regular file
Device: 19h/25d Inode: 60855680    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 17:51:56.036682655 +0800 #atime早于等于mtime/ctime,更新
Modify: 2016-04-11 17:51:44.772736377 +0800
Change: 2016-04-11 17:51:44.772736377 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ cat foo.c > /dev/null
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 12              Blocks: 8          IO Block: 4096   regular file
Device: 19h/25d Inode: 60855680    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 17:51:56.036682655 +0800 #atime更晚时,不更新
Modify: 2016-04-11 17:51:44.772736377 +0800
Change: 2016-04-11 17:51:44.772736377 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ echo "hello world" >> foo.c
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 24              Blocks: 8          IO Block: 4096   regular file
Device: 19h/25d Inode: 60855680    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 17:51:56.036682655 +0800 #改变文件后,atime不更新
Modify: 2016-04-11 17:52:30.636519093 +0800
Change: 2016-04-11 17:52:30.636519093 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ cat foo.c > /dev/null
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 24              Blocks: 8          IO Block: 4096   regular file
Device: 19h/25d Inode: 60855680    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 17:52:43.708457830 +0800 #读取文件后,如果atime早于等于mtime/ctime,更新
Modify: 2016-04-11 17:52:30.636519093 +0800
Change: 2016-04-11 17:52:30.636519093 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ cd
shuyin.wsy@localhost:~$ sudo umount /mnt

 

relatime,atime比现在早一天,那么atime在文件读取时会被更新,随便找个老文件看看:

shuyin.wsy@localhost:~$ stat elfdiff.sh
  File: `elfdiff.sh'
  Size: 2067      	Blocks: 8          IO Block: 4096   regular file
Device: 8b1h/2225d	Inode: 103158619   Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-08 17:31:36.764025160 +0800 #atime比ctime和mtime晚,且距离现在超过一天
Modify: 2016-04-08 17:31:33.536040622 +0800
Change: 2016-04-08 17:31:33.580040411 +0800
 Birth: -
shuyin.wsy@localhost:~$ cat elfdiff.sh >/dev/null
shuyin.wsy@localhost:~$ stat elfdiff.sh
  File: `elfdiff.sh'
  Size: 2067      	Blocks: 8          IO Block: 4096   regular file
Device: 8b1h/2225d	Inode: 103158619   Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 22:12:31.984860509 +0800 #符合1天的条件,更新atime
Modify: 2016-04-08 17:31:33.536040622 +0800
Change: 2016-04-08 17:31:33.580040411 +0800
 Birth: -

 

strictatime,我们以为的那种atime,每次读取都会更新,但是影响性能

shuyin.wsy@localhost:~$ sudo mount -t tmpfs -o strictatime tmpfs /mnt
shuyin.wsy@localhost:~$ cd /mnt
shuyin.wsy@localhost:/mnt$ echo "hello world" >> foo.c
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 12              Blocks: 8          IO Block: 4096   regular file
Device: 19h/25d Inode: 60853117    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 18:03:28.033857401 +0800 #最初值
Modify: 2016-04-11 18:03:28.033857401 +0800
Change: 2016-04-11 18:03:28.033857401 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ cat foo.c >> /dev/null
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 12              Blocks: 8          IO Block: 4096   regular file
Device: 19h/25d Inode: 60853117    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 18:03:35.229824129 +0800 #只要被读取,atime就更新
Modify: 2016-04-11 18:03:28.033857401 +0800
Change: 2016-04-11 18:03:28.033857401 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ cat foo.c >> /dev/null
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 12              Blocks: 8          IO Block: 4096   regular file
Device: 19h/25d Inode: 60853117    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 18:03:38.925807067 +0800 #只要被读取,atime就更新
Modify: 2016-04-11 18:03:28.033857401 +0800
Change: 2016-04-11 18:03:28.033857401 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ echo "hello world" >> foo.c
shuyin.wsy@localhost:/mnt$ stat foo.c
  File: `foo.c'
  Size: 24              Blocks: 8          IO Block: 4096   regular file
Device: 19h/25d Inode: 60853117    Links: 1
Access: (0644/-rw-r--r--)  Uid: (122712/shuyin.wsy)   Gid: (  100/   users)
Access: 2016-04-11 18:03:38.925807067 +0800 #改变文件,atime不更新
Modify: 2016-04-11 18:03:44.961779241 +0800
Change: 2016-04-11 18:03:44.961779241 +0800
 Birth: -
shuyin.wsy@localhost:/mnt$ cd
shuyin.wsy@localhost:~$ sudo umount /mnt

注意:当文件夹中的某个文件的时间改变时,文件夹本身的时间并不会受到影响

 
参考:

http://unix.stackexchange.com/questions/88840/atime-value-changing-only-once-after-file-creation

时间: 2024-10-30 04:13:50

为什么有时候读取文件,atime不更新的相关文章

win7系统为何出现读取文件错误

  win7系统黑屏是怎么回事? 微软公司称,2014年,微软将取消Windows XP的所有技术支持.Windows 7将是Windows XP的继承者.另外,Windows体验指数也由Vista的5.9上升至7.9. 但很多朋友反映安装win7时出现了问题.那么,安装时为何出现读取文件错误? 1.安装的时候为什么会出现读取文件错误? 这一般是由于盘片本身的问题或者刻盘出错造成的,请重新刻盘.请大家用中速,光盘一次刻录方式刻录用.另外,如果你采用的是DOS下虚拟光驱方式加载ISO再安装,也可能

FLASH导入声音时提示 读取文件时出现问题该怎么办?

  使用FLASH制作动画的时候,有时候我们想要导入一个声音但是老是提示我们,文件读取时出现问题,一个或多个文件没有导入.这时候怎么办呢?我想很多朋友也碰到过这个问题,这里小编根据自己经验总结下吧,希望可以帮助到需要的朋友参考,那么处理FLASH导入声音时提示:读取文件时出现问题呢?这里小编介绍下自己使用的方法. 1.今天小编在制作一个动画的时候,想要导入一个下载好的歌曲,出现问题. 2.这时候我们可以考虑重新找个地方下载需要的歌曲,当然歌曲本身没啥问题的话,我们可以将歌曲进行格式转换,这里打开

c++-读取文件内容时怎么处理空格问题?

问题描述 读取文件内容时怎么处理空格问题? 在读取一个文本内容时,空格代表的字节数有时候是1有时候是2,所以读出来的字节数就会不一样,请问怎么处理空格问题??用C++编的代码 解决方案 文件读取,读取带空格字符串的问题Android学习笔记之读取文件内容乱码问题Properties文件中的空格问题 解决方案二: 您好,可以考虑用正则表达式来过滤 空格 解决方案三: 过滤一下就可以了啊,,,, 解决方案四: 过滤一下就可以了啊,,,, 解决方案五: 能说下你为啥读出来空格有时时1,有时是2么?难道

xampp 文件无法正常更新

问题描述 xampp 文件无法正常更新 用xampp在远程服务器上架了个网站,提供有文件下载,我用Ftp上传一个exe文件,然后提供下载,最近发现下载下来的版本不对,有时候下得旧版本,有时候又可以下到最新版本(应用程序上方有版本号),有时候要下载好多次才能下得最新版,文件上传都是直接替换原来的文件的,我上服务器去搜索也没有第二个名为这个的exe文件,不知道这个是什么原因,网站是别人架的,我对这种不熟,我只用了里头的文件上传与下载功能,这个东西已经用了三四年了,从来没出现过这种问题, 解决方案 h

《Hadoop海量数据处理:技术详解与项目实战》一 3.2 HDFS读取文件和写入文件

3.2 HDFS读取文件和写入文件 Hadoop海量数据处理:技术详解与项目实战我们知道在HDFS中,NameNode作为集群的大脑,保存着整个文件系统的元数据,而真正数据是存储在DataNode的块中.本节将介绍HDFS如何读取和写入文件,组成同一文件的块在HDFS的分布情况如何影响HDFS读取和写入速度. 3.2.1 块的分布HDFS会将文件切片成块并存储至各个DataNode中,文件数据块在HDFS的布局情况由NameNode和hdfs-site.xml中的配置dfs.replicatio

FTP读取文件问题,求教

问题描述 我们将程序安装在一台装服务器系统的电脑上面,我们程序作为client端去访问硬件(等同于服务器),我发现去读取服务器上的文件有点问题:比如说下面有一个28号文件,28号文件下面有三个1,2,3号文件,每个文件都会有实时数据文件,我用同一段代码去读取文件,可是总有一个文件(比如说3号)里面的数据我们读不上来,我们是通过对比文件时间戳来知道是否是新文件,读取之后我们会跟新文件时间戳,在测试的时候,我发现可以进入那个文件(数据读不上来的那个3号文件夹),但是存到数据库里面确实没有那个文件夹的

python和shell读取文件某一行的例子

python和shell(awk命令) 可以实现直接读取文件的某一行,按行号进行读取 .并可以精准的取得该行的某个字段,这个有点类似于x轴.y轴定位某个点的操作. 一.awk取某行某列值 awk 可以设置条件来输出文件中m行到n行中每行的指定的k字段,使用格式如下: awk    'NR==m,NR==n {print $k}'  path/filename m,n,k表示实在的数值.如果要用变量来表示m,n的值,则变量需要用单引号将其引起来.NR,{print }是awk命令在此用法下的规定字

调试-c#读取文件图片及声音问题

问题描述 c#读取文件图片及声音问题 本人在学习c#然后找了别人做得一个项目,我运行也ok,我想模仿做一个,但有些看不懂.如下: 1.图片 这个LLK.data是个文件夹吗,然后从里面找出.bmp文件还是什么,我在自己的项目的properities/resources.resx添加了图片,又在项目里创建了data文件夹里面放入图片,结果不行,错误大概意思,缺少LLk.data.resources.然后我在别人的项目里见到了这个 请问这个文件怎么形成的呢,里面是不是有图片资源啊.还有上面图片的两行

utf-8-jquery用ajax读取文件的时候里面的中文乱码

问题描述 jquery用ajax读取文件的时候里面的中文乱码 网页是UTF-8 txt也另存为UTF-8,读取出来以后还是乱码 解决方案 txt默认编码就可以了,,不需要设为utf-8吧,,不行的话,,你用文件流读取试试 解决方案二: ajax请求的文件也要存储为utf-8格式,乱码就是编码不统一的问题 解决方案三: 检查一下你的服务器(如Tomcat.Resin.Nginx.Apache等)编码设置是否正确. 解决方案四: 页面里面加入这句 Response.ContentEncoding =