Linux 磁盘空间异常占用排查:被删除文件仍被进程占用导致空间未释放

Linux 磁盘空间异常占用排查:被删除文件仍被进程占用导致空间未释放
XRLinux 中被删除文件因进程占用导致磁盘空间未释放问题
一、问题现象 / 发现
磁盘占用告警:执行
df -h命令显示根分区(/dev/sda1)总容量 4.9G,已 100% 占用,可用空间为 0,导致系统无法写入新文件。1
2Filesystem Size Used Avail Use% Mounted on
/dev/sda1 4.9G 4.9G 0 100% /磁盘统计矛盾:执行
du -h / --max-depth=1统计根目录总占用仅 1.3G,与df显示的 4.9G 占用严重不符,存在 “隐藏占用”。关键日志文件异常:通过手动排查进程文件描述符,发现
/var/log下的多个核心日志文件(messages、syslog、auth.log等)已被删除,但仍被进程占用,状态标记为(deleted)。1
2l-wx------ 1 root root 64 Aug 9 22:03 10 -> /var/log/messages (deleted)
l-wx------ 1 root root 64 Aug 9 22:03 7 -> /var/log/syslog (deleted)
二、问题分析
- 被删除文件的进程占用机制:
Linux 系统中,当文件被rm命令删除后,若仍有进程持有该文件的文件描述符(如日志服务正在写入),内核不会立即释放磁盘空间,df仍会统计为 “已占用”,但du无法检测到(因文件已从目录树中移除),导致两者数据矛盾。 - 日志服务的角色:
被占用的文件均为系统日志文件,由rsyslog服务(系统日志守护进程)管理。rsyslog持续写入这些日志文件,即使文件被手动删除,进程仍保持对其的引用,导致空间无法释放。 - 磁盘满的直接原因:
被删除的日志文件实际占用了大量空间(推测为几百 MB),但因进程占用未释放,导致根分区被 “虚占” 至 100%。
三、问题解决
1. 定位问题根源
通过排查进程文件描述符,确认被删除但仍被占用的日志文件:
1 | # 手动遍历进程文件描述符(无 lsof 时) |
1 | # 如果有安装lsof,可以用: |
查询结果:
1 | l-wx------ 1 root root 64 Aug 9 22:03 10 -> /var/log/messages (deleted) |
2. 释放被占用空间
重启 rsyslog 服务,使其释放对已删除日志文件的引用,内核随即回收磁盘空间:
1 | systemctl restart rsyslog |
3. 验证解决效果
执行 df -h 确认根分区使用率下降,可用空间恢复:
1 | Filesystem Size Used Avail Use% Mounted on |
四、总结
- 核心原因:被删除的日志文件因
rsyslog进程持续占用,导致磁盘空间未释放。 - 解决关键:重启持有文件描述符的进程(此处为
rsyslog),强制释放被占用空间。 - 预防建议:
- 避免手动删除正在写入的日志文件,改用
logrotate工具自动轮转日志。 - 定期执行
lsof | grep deleted检查隐藏占用,及时释放无效文件。
- 避免手动删除正在写入的日志文件,改用
评论
匿名评论隐私政策








