本身在維護的系統偶爾會有 inode 滿的問題,但實際上過去維護過的系統很少遇到 inode 會有滿的情況,所以這篇就來講一下到底是發生什麼事情 …
一般情況都是小檔太多造成 inode 滿,但身為系統管理者,該系統的應用情境應該不致於讓你無法預期會有這種情況,所以這邊講的是特殊的例外情況造成 inode 滿。
透過 df / du 這個工具可以輕鬆檢測到 inode 佔用的情況
df 檢查硬碟 inode 使用狀況
$ df -i
du 檢查目錄 inode 使用狀況
du 常常用來檢查硬碟使用占比,用來檢查 inode 也很好用
$ du --inode --max-depth=1
檢查後發現吃滿 inode 是在於 /var/spool/clientmqueue
這裡面的檔案數量驚人!仔細查看 clientmqueue 裡面的內容發現是因為當執行 cron 的時候沒有指定好 command stderr / stdout 的重新定向就會跑到 clientmqueue 這邊來,當你的 cron 很頻繁的執行,而裡面的 script 都沒有處理好 stderr / stdout 就會吃爆 clientmqueue。
常見的錯誤寫法
curl https://www.google.com.tw >/dev/null
正確寫法
curl https://www.google.com.tw >/dev/null 2>&1
如果偶爾看到「You have new mail in /var/spool/mail/root」也是沒寫好,遇到一直寄發 mail 給 root 塞爆 /var/spool/mail/root
的情況