记一次守护日志导致硬盘空间告警问题
问题
后台守护进程高频写日志导致硬盘空间频繁报警, 直接删除日志文件硬盘空间依然增长.
初步分析为日志文件当前状态为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
不恢复原来文件句柄.