Linux

rm 會刪除網路客戶端目前正在訪問的文件嗎?

  • February 7, 2014

我的網路服務在客戶端上執行nginx並使用標頭向客戶端php傳遞文件,如果我使用它將如何處理客戶端目前正在訪問/下載的文件?X-Accel-Redirect``rm /my/folder/*.*

當程序開始從文件中讀取時,它會創建一個附加到文件所在的 inode 的文件句柄。

刪除文件時,會刪除從目錄到 inode 的連結。該連結將立即被刪除,因此其他程序將無法找到該文件。

但是,只要 inode 有一個活動的文件句柄,就仍然可以從使用該文件句柄的程序訪問內容。一旦具有該 inode 的文件句柄的所有活動程序都關閉了它們的文件句柄,文件所在的空間將被標記為空。

您可以將文件名視為一種符號連結。

  1. 您有一個名為 的文件/inodes/1234,並將其符號連結到/myapp/myfile.txt
  2. 你打開/myapp/myfile.txt。真正發生的是你打開/inodes/1234了,因為那是實際的文件。
  3. 您刪除符號連結/myapp/myfile.txt。原始文件/inodes/1234仍然存在,在步驟 2 中打開它的程序仍在讀取/訪問它。
  4. 另一個程序要求/myapp/myfile.txt. 它不存在,因為您刪除了符號連結。(當然,原版/inodes/1234仍然存在!)
  5. 第二個程序要創建/myapp/myfile.txt. 作業系統創建文件/inodes/4711並創建一個符號連結到/myapp/myfile.txt

當然它比這稍微複雜一些,但在這種情況下它是一個有用的模型。

順便說一句,這也是對“為什麼我的磁碟已滿,即使我刪除了這個巨大的日誌文件並且沒有其他東西佔用空間”這個問題的答案 - 如果一個程序仍在讀取或寫入文件,你剛剛做了它是看不見的,你實際上並沒有清除它。

引用自:https://serverfault.com/questions/573885