記一次守護日誌導致硬盤空間告警問題
問題
後臺守護進程高頻寫日誌導致硬盤空間頻繁報警, 直接刪除日誌文件硬盤空間依然增長.
初步分析爲日誌文件當前狀態爲open
狀態, 當文件open
以後,系統就以inode
號碼來識別這個文件,不再考慮文件名.刪除一個已open
日誌文件, 只是影響到文件系統中inode
引用鏈接數, 並未影響進程已打開文件inode
文件數據block
, 寫操作依然有效, 導致硬盤空間不斷增長.
解決方法1
通過proc
文件系統( /proc/pid/fd
) 獲取進程運行中文件句柄鏈接進而獲取實際關聯的文件名稱, 並強制使用 ‘> fd’ 清空日誌.
pidof xxx
ls -l /proc/pid/fd/
lrwx------ 1 root root 64 May 24 10:39 0 -> /tmp/2018-04-19_205225.log (deleted)
lrwx------ 1 root root 64 May 24 10:39 1 -> /tmp/2018-04-19_205225.log (deleted)
lrwx------ 1 root root 64 May 24 10:39 2 -> /tmp/2018-04-19_205225.log (deleted)
...
(deleted) 標識日誌文件已刪除
> 2
強制清空日誌
解決方法2
重定向當前進程日誌文件句柄到 /dev/null
. 這裏需要一個工具reredirect, 可以將運行中進程文件句柄直接重定向到指定文件或者文件句柄. 其實現原理爲通過 ptrace
attach 到運行中進程, 調用 syscall dup
dup2
重定向指定文件句柄即可.
reredirect -N -m /dev/null pid
-N
不恢復原來文件句柄.