Linux時間引數atime、ctime、mtime
在linux下每個檔案(目錄)都會記錄很多時間引數,主要有三個關於檔案變動的時間——mtime、atime、ctime,它們儲存與inode
“資料結構”中,使用stat filename
命令可以檢視它們。
1.ctime
change time:當檔案(目錄)的“狀態”被改變時,這個時間會被更新,如檔案的許可權、擁有者、所屬組屬性、大小等。
如下:
2. mtime
modification time:當檔案(目錄)的“內容資料”被修改時,這個時間會更新,許可權的修改不會影響該時間。
注意:對於目錄來講,它的內容是該目錄路徑下的檔案(目錄)名列表,這也就意味著,當你在某個目錄下建立新的檔案(目錄)時,該目錄的mtime
如下:
細心的小夥伴可能會發現,我們只改變了檔案的內容,但是檔案的ctime
也改變了,這是因為當改變了檔案內容後,檔案的大小屬性也改變了,於是ctime
也會隨之改變。
3. atime
access time:獲取時間,即當檔案的“內容被訪問讀取”時,這個時間會被更新,比如cat
某檔案時,該檔案的atime
會改變。
不過這是一個有爭議的時間引數,在某些Linux版本,當你使用cat、more讀取檔案內容後,atime
並不會更新,比如我剛才在自己的Linux上測試時,cat
檔案後,它的atime
並沒有隨之改變,為什麼呢?
1. atime
未更新原因
想想你平常在使用Linux時使用比較頻繁的命令是什麼,我想ls
cat
使用的應該很頻繁了吧。那麼當你每ls
一次,檔案的atime
都會更新一次,除此之外,系統本身還有大量的檔案訪問,這些訪問造成的atime
更新如果都被寫入到磁碟中,這樣做會帶來幾個問題: 1. 大量的檔案訪問,會導致頻繁的將
atime
寫入磁碟,浪費時間,降低系統的效能。 2. 這樣做本身也是特別費電。
說道這兒有人可能會問,為什麼ctime
、mtime
為什麼會即時更新呢?
原因是,在Linux系統中,我們往往最關心的是檔案的修改時間,比如有人告訴你上週五完成的一個程式有個小bug,於是你就通過mtime
或者是ctime
定位找到上週五修改過的檔案,你當然不會通過atime
去找了,因為你可能昨天還ls
所以,每次讀取檔案後更新它的
atime
好像並沒有這個必要,一是我們平常並不會經常使用這個時間引數,二是頻繁的更新它會導致系統的效能的損耗。於是Linux核心的開發人員為了提高效能,在2.6.30
版本之後,修改了atime
的更新機制。我查看了自己的版本,果然: 2. atime
會更新的情況
那麼在2.6.30
之後的版本,只有在下列幾種情況下,才會更atime
:
1. atime
小於ctime
或mtime
時。舉個例子:某檔案的atime
是11:02
,而mtime
是同一天的12:03
,那麼,當你cat
改檔案後,它的atime
會更新。
atime
大於ctime
的情況:
atime
小於ctime
的情況:
- 當前讀取時間與上次間隔大於24小時。
- 如果將分割槽mount的掛載的時候指定採用非relatime方式(預設採用relatime方式),如strictatime.
補充:在OS啟動的時候,將各個分割槽掛載到不同的目錄,在掛載(mount)的引數中採用strictatime,表明及時更新atime。在2.6.30之後mount添加了”relatime”和”strictatime”兩個選項,詳細的可以通過”man mount”檢視。
3. 如何讓你的atime
即時更新
那麼如果你想讓你的Linux檔案的atime
及時更新,要怎麼做呢?
OS啟動的時候會讀取/etc/fstab檔案,在你的Linux中修改etc/fstab
檔案,新增strictatime
選項:
然後重啟你的OS,再去試試,是不是隻要讀取檔案內容,它的atime
就會改變呢!