1. 程式人生 > >Linux時間引數atime、ctime、mtime

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. 這樣做本身也是特別費電。

說道這兒有人可能會問,為什麼ctimemtime為什麼會即時更新呢?
原因是,在Linux系統中,我們往往最關心的是檔案的修改時間,比如有人告訴你上週五完成的一個程式有個小bug,於是你就通過mtime或者是ctime定位找到上週五修改過的檔案,你當然不會通過atime去找了,因為你可能昨天還ls

過它。
所以,每次讀取檔案後更新它的atime好像並沒有這個必要,一是我們平常並不會經常使用這個時間引數,二是頻繁的更新它會導致系統的效能的損耗。於是Linux核心的開發人員為了提高效能,在2.6.30版本之後,修改了atime的更新機制。我查看了自己的版本,果然:
這裡寫圖片描述

2. atime會更新的情況

那麼在2.6.30之後的版本,只有在下列幾種情況下,才會更atime
1. atime小於ctimemtime時。舉個例子:某檔案的atime11:02,而mtime是同一天的12:03,那麼,當你cat改檔案後,它的atime會更新。
atime大於ctime的情況:
這裡寫圖片描述

atime小於ctime的情況:
這裡寫圖片描述

  1. 當前讀取時間與上次間隔大於24小時。
  2. 如果將分割槽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就會改變呢!

參考資料