開發發現某個雲服務器無法啓動進程,提示“No space left on device”,但是使用#df -h查看容量的時候,明明還有很多的空間。於是使用#df -i,發現inode節點已經全部用光了,所以現在不能建立任何新的文件。
既然如此就要查出來是哪個文件夾裏會有如此多的文件來佔用這些inode,使用一個小腳本:#for i in /*; do echo $i; find $i | wc -l; done,獲取到/mnt下有一個文件佔用了絕大多數的inode,如圖:
於是就進入到mnt這個文件夾裏,慢慢找尋到底是哪個文件夾,用上面那個語句一點一點縮小範圍,最後確定文件夾原來就是data文件夾,如圖:
現在如果要#rm -rf data/*的話,是沒有效果的,有效果的話也很慢。而且很有可能報“-bash: /bin/rm: Argument list too long”的錯,因爲這個文件夾裏面的小文件實在太多了,有足足兩百五十多萬個,那麼怎麼樣處理這樣的情況?
用find搭配-type f -exec rm {} \;可能會引起內存溢出,用文件夾重置命令搭配"--reference" 也沒什麼效果。
這時最好的方法就是使用rsync!
先#yum install rsync,當然了現在inode是飽和的狀態,yum install是會報錯的:
那麼就需要手動刪除一些文件,騰出來一部分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%,世界恢復了清靜。
最後的最後,如果您覺得本文對您升職加薪有幫助,那麼請不吝贊助之手,刷一下下面的二維碼,贊助本人繼續寫更多的博文!