從“No space left on device”到刪除海量文件

開發發現某個雲服務器無法啓動進程,提示“No space left on device”,但是使用#df -h查看容量的時候,明明還有很多的空間。於是使用#df -i,發現inode節點已經全部用光了,所以現在不能建立任何新的文件。


e6143a47a6317998ff12897f6cbc68dd.png


既然如此就要查出來是哪個文件夾裏會有如此多的文件來佔用這些inode,使用一個小腳本:#for i in /*; do echo $i; find $i | wc -l; done,獲取到/mnt下有一個文件佔用了絕大多數的inode,如圖:

a032f07f1691b80baffd5aaee45c81db.png


於是就進入到mnt這個文件夾裏,慢慢找尋到底是哪個文件夾,用上面那個語句一點一點縮小範圍,最後確定文件夾原來就是data文件夾,如圖:

b57d4eaf972a500893d9acd2ee3bbc78.png


現在如果要#rm -rf data/*的話,是沒有效果的,有效果的話也很慢。而且很有可能報“-bash: /bin/rm: Argument list too long”的錯,因爲這個文件夾裏面的小文件實在太多了,有足足兩百五十多萬個,那麼怎麼樣處理這樣的情況?


用find搭配-type f -exec rm {} \;可能會引起內存溢出,用文件夾重置命令搭配"--reference" 也沒什麼效果。


這時最好的方法就是使用rsync!


#yum install rsync,當然了現在inode是飽和的狀態,yum install是會報錯的:

734903c66c830d89925dc9d7d3e7bee7.png


那麼就需要手動刪除一些文件,騰出來一部分inode供yum使用,安裝完畢rsync之後,找到一個空文件夾,如果沒有空文件夾,就手動建立一個。 


使用命令:#rsync --delete-before -a -H -v --progress --stats /空文件夾的路徑/ /海量小文件的路徑/


    –delete-before 接收者在傳輸之前進行刪除操作

    –progress 在傳輸時顯示傳輸過程

    -a 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性

    -H 保持硬連接的文件

    -v 詳細輸出模式

    -stats 給出某些文件的傳輸狀態


如果你開了這個服務器的兩個窗口,一個是執行上面的命令,另一個是在海量文件夾裏執行#ls,這個時候ls命令是卡死的,過了大約2分鐘,就會看到ls展示的文件噴涌而出,整個電腦屏幕好比***帝國一樣,異常壯觀。


靜等大約20分鐘,整個文件夾刪除乾淨,inode也釋放了97%,世界恢復了清靜。

3a0e3f473b04b32e24a72af4fadabdc5.png


最後的最後,如果您覺得本文對您升職加薪有幫助,那麼請不吝贊助之手,刷一下下面的二維碼,贊助本人繼續寫更多的博文!

wKioL1l16m3BMYDKAACPHEqd55Q687.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章