為什么打開刪除文件的文件句柄會(huì)填滿硬盤
所以,長話短說,我編寫了一個(gè)(python)程序,打開了很多文件,在其中寫入數(shù)據(jù),然后刪除了文件,但沒有正確關(guān)閉文件把手。之后一些時(shí)間,由于磁盤空間不足,此
解答動(dòng)態(tài)
在Unix中刪除文件只是刪除對其數(shù)據(jù)的命名引用(因此系統(tǒng)調(diào)用名為unlink/unlinkat,而不是delete)。為了釋放數(shù)據(jù)本身,必須沒有對它的其他引用。參考資料可以在一些方法:一定要有不要在文件系統(tǒng)上進(jìn)一步引用這些數(shù)據(jù)(stnlink必須為0)--硬鏈接時(shí)可能會(huì)發(fā)生這種情況。否則,我們會(huì)在仍然有辦法從服務(wù)器訪問數(shù)據(jù)時(shí)丟棄數(shù)據(jù)文件系統(tǒng)。那里不能從打開的文件句柄進(jìn)一步引用此數(shù)據(jù)(在Linux上,內(nèi)核中相關(guān)結(jié)構(gòu)文件的fèu計(jì)數(shù)必須為0)。否則,仍然可以通過讀取或?qū)懭胛募浔ɑ騆inux上的/proc/pid/fd)來訪問或修改數(shù)據(jù),我們需要某個(gè)地方繼續(xù)存儲(chǔ)它。 一旦滿足這兩個(gè)條件,數(shù)據(jù)就可以被釋放。由于您的案例違反了條件#2—您仍然有打開的文件句柄—數(shù)據(jù)繼續(xù)存儲(chǔ)在磁盤上(因?yàn)樗鼪]有其他地方可去),直到文件句柄關(guān)閉。
有些程序甚至使用此方法來簡化數(shù)據(jù)清理。例如,假設(shè)一個(gè)程序需要在磁盤上存儲(chǔ)一些大數(shù)據(jù)以進(jìn)行中間工作,但不需要與其他程序共享。如果它打開并立即刪除該文件,它就可以使用它,而不必?fù)?dān)心確保它們在退出時(shí)被清除——在關(guān)閉(fd)或退出時(shí),打開的文件描述符引用計(jì)數(shù)將自然下降到0,并且無論程序是否正常退出,相關(guān)空間都將被釋放。
detection 刪除的文件仍在運(yùn)行可以使用lsof找到由文件描述符保持打開的文件,使用類似以下:
%lsof-nP+l1命令PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE namespulseaudi 1799 cdown 6u REG 0,1 67108864 0 1025/成員:pulseaudio(已刪除)chrome 46460 cdown 45r REG 0,27 131072 0 105357/dev/shm/。谷歌瀏覽器.gL8tTh(已刪除) 此列表列出了所有打開的文件,這些文件的st\n鏈接值小于1。
緩解 在您的情況下,您可以通過終止進(jìn)程來關(guān)閉文件句柄,如果可能,這是一個(gè)很好的解決方案。
在不可能的情況下,在Linux上,您可以通過/proc/pid/fd訪問文件描述符支持的數(shù)據(jù),并將其截?cái)酁?大小,即使文件已經(jīng)被刪除刪除:
:quot;/proc/pid/fd/$num“設(shè)備上沒有剩余空間”是ENOSPC,這是文件系統(tǒng)空間不足時(shí)我們生成的。如果達(dá)到文件描述符,則會(huì)收到EMFILE(進(jìn)程級短缺,由strerror呈現(xiàn)為“打開的文件太多”)或ENFILE(系統(tǒng)級短缺,由strerror呈現(xiàn)為“系統(tǒng)中打開的文件太多”)。進(jìn)程級軟可以用ulimit-Sn檢查,系統(tǒng)級可以在/proc/sys/fs/file-max.
中查看- End
免責(zé)聲明:
本頁內(nèi)容僅代表作者本人意見,若因此產(chǎn)生任何糾紛由作者本人負(fù)責(zé),概與琴島網(wǎng)公司無關(guān)。本頁內(nèi)容僅供參考,請您根據(jù)自身實(shí)際情況謹(jǐn)慎操作。尤其涉及您或第三方利益等事項(xiàng),請咨詢專業(yè)人士處理。