Linux
rm 會刪除網路客戶端目前正在訪問的文件嗎?
我的網路服務在客戶端上執行
nginx
並使用標頭向客戶端php
傳遞文件,如果我使用它將如何處理客戶端目前正在訪問/下載的文件?X-Accel-Redirect``rm /my/folder/*.*
當程序開始從文件中讀取時,它會創建一個附加到文件所在的 inode 的文件句柄。
刪除文件時,會刪除從目錄到 inode 的連結。該連結將立即被刪除,因此其他程序將無法找到該文件。
但是,只要 inode 有一個活動的文件句柄,就仍然可以從使用該文件句柄的程序訪問內容。一旦具有該 inode 的文件句柄的所有活動程序都關閉了它們的文件句柄,文件所在的空間將被標記為空。
您可以將文件名視為一種符號連結。
- 您有一個名為 的文件
/inodes/1234
,並將其符號連結到/myapp/myfile.txt
- 你打開
/myapp/myfile.txt
。真正發生的是你打開/inodes/1234
了,因為那是實際的文件。- 您刪除符號連結
/myapp/myfile.txt
。原始文件/inodes/1234
仍然存在,在步驟 2 中打開它的程序仍在讀取/訪問它。- 另一個程序要求
/myapp/myfile.txt
. 它不存在,因為您刪除了符號連結。(當然,原版/inodes/1234
仍然存在!)- 第二個程序要創建
/myapp/myfile.txt
. 作業系統創建文件/inodes/4711
並創建一個符號連結到/myapp/myfile.txt
當然它比這稍微複雜一些,但在這種情況下它是一個有用的模型。
順便說一句,這也是對“為什麼我的磁碟已滿,即使我刪除了這個巨大的日誌文件並且沒有其他東西佔用空間”這個問題的答案 - 如果一個程序仍在讀取或寫入文件,你剛剛做了它是看不見的,你實際上並沒有清除它。