日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

从对我的质疑说起,谈谈Linux下的文件删除

發(fā)布時(shí)間:2023/12/4 linux 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从对我的质疑说起,谈谈Linux下的文件删除 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

特特本來(lái)就是個(gè)剛畢業(yè)的小菜,很多知識(shí)都是靠著大家的指點(diǎn)才慢慢學(xué)會(huì)的。之前在一篇"純屬虛構(gòu)"的文章 (鵝廠后臺(tái)開發(fā)工程師的工作日常) 提到使用 rm 命令刪除一個(gè)近 100 G 的 log 文件。

很榮幸,這篇文章被一個(gè)大號(hào)轉(zhuǎn)載了,獲得了很不錯(cuò)的閱讀量。但是,當(dāng)我看到有大佬在公眾號(hào)留言,"質(zhì)疑" 我文章內(nèi)容的正確性,甚至把我個(gè)人的水平上升到了鵝廠程序員的水平高低問題時(shí),我真是戰(zhàn)戰(zhàn)兢兢、瑟瑟發(fā)抖。

咱也不敢說,咱也不敢問,只能默默地去補(bǔ)習(xí)相關(guān)的知識(shí),于是有了這篇文章。

一、Linux 刪除文件的原理

通過查閱資料知道,Linux 系統(tǒng)下的文件被分成文件元數(shù)據(jù) (metadata)和用戶數(shù)據(jù) (user data) 兩部分。

用戶數(shù)據(jù),亦即文件數(shù)據(jù)塊 (data block),是保存文件真實(shí)內(nèi)容的空間;而元數(shù)據(jù)則是保存如文件大小、創(chuàng)建時(shí)間、所有者等文件的附加屬性。

在 Linux 中,文件的元數(shù)據(jù)保存在一個(gè) inode 結(jié)構(gòu)中,inode 號(hào)是文件的唯一標(biāo)識(shí),而文件名僅是為了方便人們的記憶和使用。當(dāng)然文件名與 inode 之間會(huì)存在映射關(guān)系。

而 inode 結(jié)構(gòu)中與本文提到的文件刪除相關(guān)的兩個(gè)重要參數(shù)分別是:i_nlink 和 i_count。從 VFS 的 inode 結(jié)構(gòu)體定義中可以看到其類型如下:

struct inode {...const struct inode_operations *i_op; // 索引節(jié)點(diǎn)操作unsigned long i_ino; // 索引節(jié)點(diǎn)號(hào)atomic_t i_count; // 引用計(jì)數(shù)器unsigned int i_nlink; // 硬鏈接數(shù)目... }

當(dāng)某個(gè)進(jìn)程使用了文件時(shí),該文件的 i_count 值會(huì)增加;當(dāng)創(chuàng)建文件的硬鏈接 (區(qū)別于軟鏈接)時(shí),該文件的 i_nlink 值會(huì)增加。

當(dāng) i_nlink 和 i_count 均為 0 時(shí),文件才會(huì)被真正刪除 (這里的刪除是指刪除了文件名到 inode ?之間的鏈接關(guān)系,而文件的內(nèi)容仍然完好無(wú)損地保存在磁盤中。如果此時(shí)關(guān)閉機(jī)器,阻止任何新的寫磁盤操作,那么被刪除的文件理論上也是可以恢復(fù)的)。

而執(zhí)行刪除命令 rm 時(shí),本質(zhì)上只是減少了 (或置0) 該文件的磁盤引用計(jì)數(shù) i_nlink。

換言之,如果被執(zhí)行 rm 命令的文件正在被其他進(jìn)程所引用,那么此時(shí)該文件對(duì)應(yīng)的 i_count 將不為0,即便執(zhí)行了 rm 操作,該文件并沒有真正被刪除,占用的磁盤空間也未被釋放。

因此,上面截圖中的評(píng)論是正確的,僅僅通過 rm 命令確實(shí)無(wú)法使用被進(jìn)程打開的文件所占用的磁盤空間。

PS:為啥小特特在工作中可以直接通過 rm 刪除和釋放被進(jìn)程使用的 log 文件呢?其實(shí)是因?yàn)橥ㄟ^腳本刪除文件時(shí)會(huì)觸發(fā)進(jìn)程 reload 的邏輯,進(jìn)程執(zhí)行 reload 時(shí)會(huì)重新打開 log 文件 (當(dāng)然會(huì)先關(guān)閉)。

二、Linux 刪除大文件的幾個(gè)簡(jiǎn)單方法

那么,Linux 下刪除一個(gè)大文件的正確方式是什么呢?(假設(shè)待刪除的大文件名為 access.log)

個(gè)人覺得最簡(jiǎn)單的方式是執(zhí)行命令?> access.log。通過重定向 null 到待刪除的文件可以讓該文件瞬間成為空白,有效地釋放磁盤空間。

另外,cat /dev/null > access.log 命令也是一個(gè)不錯(cuò)的選擇。/dev/null 是一個(gè)特殊的文件,它可以清空送到它這里來(lái)的所有輸入,而它的輸出則可被視為一個(gè)空文件。

echo -n "" > access.log 也是常用的一個(gè)命令。需要注意的是,別忘了加上 -n 選項(xiàng) (否則 access.log 文件中會(huì)出現(xiàn)一個(gè)空白行)。

當(dāng)然,還可以通過 truncate 命令將待刪除的文件大小縮小為0,但是我平時(shí)用得很少。

三、Linux 進(jìn)程打開的文件信息

再延伸下:

在 Linux 系統(tǒng)下,當(dāng)進(jìn)程打開一個(gè)文件后,內(nèi)核會(huì)為該進(jìn)程在 /proc/ 目錄下建立一個(gè)以該進(jìn)程 pid 為名的文件夾來(lái)保存該進(jìn)程的相關(guān)信息。而 /proc/pid/fd/ ?文件夾保存的就是該進(jìn)程打開的所有文件的文件描述符 (file descriptor, fd)。

除了打開的本地文件,進(jìn)程建立的 socket 鏈接也算是一個(gè) fd。

一個(gè)進(jìn)程打開的文件數(shù)量是有限的,執(zhí)行 cat /proc/pid/limits | grep "Max open files" 命令可以查看進(jìn)程號(hào)為 pid 的進(jìn)程允許打開的最大文件個(gè)數(shù)。

當(dāng)在 Linux 下調(diào)用 open 函數(shù)返回了系統(tǒng)錯(cuò)誤碼 24 時(shí) (對(duì)應(yīng)的系統(tǒng)錯(cuò)誤描述是:"Too many open files"),則表示當(dāng)前進(jìn)程打開的文件數(shù)量超過了系統(tǒng)設(shè)置的上限。

如果你的程序遇到了這個(gè)錯(cuò)誤,按我的經(jīng)驗(yàn)來(lái)看,一般是出現(xiàn)句柄泄漏了 (可能是文件未正常關(guān)閉、socket 鏈接未正常斷開等),這時(shí)候就需要你耐心地 debug 啦。

四、如何高效清空包含大量小文件的目錄

再再延伸下:

Linux 下怎么快速地刪除包含大量小文件的目錄?

直接通過 rm -rf ./* 命令容易導(dǎo)致系統(tǒng) I/O陡增。我一般使用的方法是利用 rsync 命令同步目錄的機(jī)制,通過新建一個(gè)空目錄,再將待刪除的目錄與新建的空目錄進(jìn)行同步,從而達(dá)到清空目錄的目的。

總結(jié)

以上是生活随笔為你收集整理的从对我的质疑说起,谈谈Linux下的文件删除的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。