在做Nginx的日誌檔切割,發現一個詭異的問題。當我手動把Nginx的日誌檔案轉移位置以後,如果不reload設定文件,Nginx還是繼續寫這個被轉移到其他目錄的日誌檔案。 難道Nginx寫日誌的時候不是通過檔案路徑嗎? 為什麼日誌檔被轉移走了還是能寫到?
欢迎选择我的课程,让我们一起见证您的进步~~
這是檔案系統的特性,有點類似程式語言管理變數生命週期的里的引用計數。移動一個文件,甚至刪除一個文件,只要這個文件還被某個行程打開著,這個文件就還能被存取。但如果所有的「引用」都沒有了,例如文件名,硬連結(hard link)及文件句柄(不再被程式打開著),才影響對文件的下一次引用,就表現為「找不到文件了」。
我覺得原因是,nginx打開的log檔案之後,在系統中實際上是以inode來標識的,移動檔案並不會修改inode的編號,所以還會繼續寫入該檔案。
nginx為了更快的速度,一般都快取了檔案的inode的。
這是檔案系統的特性,有點類似程式語言管理變數生命週期的里的引用計數。移動一個文件,甚至刪除一個文件,只要這個文件還被某個行程打開著,這個文件就還能被存取。但如果所有的「引用」都沒有了,例如文件名,硬連結(hard link)及文件句柄(不再被程式打開著),才影響對文件的下一次引用,就表現為「找不到文件了」。
我覺得原因是,nginx打開的log檔案之後,在系統中實際上是以inode來標識的,移動檔案並不會修改inode的編號,所以還會繼續寫入該檔案。
nginx為了更快的速度,一般都快取了檔案的inode的。