標籤:style blog http 使用 strong 檔案
Linux檔案時間解析
寫這篇小文章的緣由是之前做過一個項目,需要定期將檔案轉走,也許專業點的名詞叫rollover。那麼這就需要判斷一個檔案是否到了轉走的時間,從而就需要知道檔案的建立時間。 Linux檔案分為狀態改動時間ctime,修改時間mtime以及訪問時間atime,那麼它們是怎麼變化的呢?需要注意這個ctime可不是建立時間,是Change Time的縮寫,修改時間那就是檔案修改的時間Modify Time,訪問時間就是檔案讀取的時間Access Time。其實不然,這裡面大有玄機。建立一個檔案touch test,寫入內容“abc”。我們可以通過stat test命令來查看檔案的這三個時間。剛建立,可以發現三個時間是一樣的。:
1.狀態改動時間
實際上,所謂狀態改動,其實就是inode資訊改動的時間。那麼具體哪些操作會導致inode資訊改動呢?我們知道linux檔案inode中包含的資訊有檔案許可權,訪問時間,建立時間資訊,檔案大小,連結數,檔案所屬使用者等資訊,那麼更改這些資訊會導致ctime發生變化。
- 我們改變檔案test的許可權,會導致ctime變化。接著圖之前的例子,我們執行chmod -w test, 再次執行stat test可以看到結果如所示,狀態改動時間ctime發生了變化,而修改時間和訪問時間不變。同理,我們使用chown命令修改檔案所屬使用者和組等資訊,也會導致ctime發生變化。此外建立永久連結如ln test test1,修改檔案內容如echo ‘hehe‘ >> test都會使得ctime發生變化(需要注意的是,建立符號串連ln -s test test2並不會導致ctime變化,因為軟串連相當於是另外一個檔案,並不影響本身這個檔案了)。
- 那麼總結起來,修改狀態改動時間ctime的情況有如下幾種情況:
a.修改檔案許可權或者所有者、連結數等屬性,如chmod,chown,ln等操作(不包括ln -s)。
- b.修改檔案內容。(當然也會改變mtime,如果是使用vim等工具開啟檔案再修改,同時也會修改atime。如果只是用 echo ‘hehe‘ >> test 這個命令進行追加寫入,則只會修改ctime,mtime,不影響atime)。
2.修改時間
修改時間我們很容易想成檔案有修改才改變,那其實也的確是這樣,只是這個修改是指修改的操作,不是說檔案內容不變它就不改變,而是需要檔案沒有進行過寫操作。比如我們用命令vim test開啟檔案,在test中加一個字元‘d‘,然後再刪除字元‘d‘,這個時候用:w儲存檔案,我們會發現雖然test檔案內容沒有變化,但是它的修改時間mtime已經更新。當然這個操作本身是先開啟檔案再修改的,所以atime也會更新, ctime肯定也要更新。
3.訪問時間
只要我們是讀取檔案,都會修改訪問時間atime。比如more, cat命令等。為解決檔案讀取頻繁的系統中atime更新所帶來的開銷問題,所以很多SA都在掛裝檔案系統的時候使用noatime屬性來停止更新atime,這樣可以把atime當做檔案建立時間來使用。但是有些程式需要根據atime進行一些判斷和操作,所以Linux在2.6新版本的核心就推出了一個relatime特性。使用這個特性來掛裝檔案系統後,只有當mtime比atime更新的時候,才會更新atime。也就是說單純的more,cat命令並不會更新atime,只有當你修改過檔案後再次讀取才會更新atime。
使用了relatime特性後,比如你使用echo ‘hehe‘ >> test命令修改test檔案內容,剛剛寫入完,可以發現ctime和mtime都更新了,但是atime還沒有更新。此時,你使用cat test或者more等命令開啟test檔案,這樣就會更新atime了。如所示
4.參考資料
- linux C一站式編程之ext2檔案系統
- linux檔案三種時間