典型表现为df-h使用率持续上涨而du-sh/*统计远小于df结果,主因是小文件堆积或已删文件句柄未释放;需用inotifywait、auditd、lsof、strace等工具定位异常进程,并区分日志轮转失效、临时文件残留、守护进程崩溃等场景处置。

这类故障典型表现为磁盘空间缓慢但持续下降,df -h 显示使用率不断上涨,而 du -sh /* 统计总和却远小于 df 结果——说明有大量小文件被创建后未及时清理,或已被删除但句柄仍被进程持有。
快速定位异常写入进程
用 inotifywait 监控高频文件创建行为(需安装 inotify-tools):
-
inotifywait -m -e create,attrib /tmp /var/log /var/spool —— 实时捕获指定目录下新建文件事件,观察是否某进程反复在固定路径(如
/tmp/xxx.pid、/var/log/app/trace_*.log)生成同名或递增编号的小文件 - 若无法安装工具,改用 auditd 做系统级追踪:
auditctl -w /tmp -p wa -k tmp_writes
再用 ausearch -k tmp_writes | head -20 查看最近写操作的进程 PID 和命令路径
确认进程是否真在死循环写文件
对疑似进程执行以下检查:
- 查其打开的文件描述符数量:
lsof -p PID | wc -l —— 若持续增长(尤其 >1000),极可能在反复 open() 而未 close() - 看其当前写入目标:
lsof -p PID | grep -E "(REG|DIR).*[0-9]+$" —— 筛出常规文件和目录,重点关注/tmp、/var/log、/dev/shm下的频繁写入路径 - 跟踪其系统调用:
strace -p PID -e trace=openat,write,close,unlink 2>&1 | grep -E "(open|write|unlink)" —— 观察是否出现openat(..., O_CREAT|O_WRONLY) = 12→write(12, ...)→close(12)的高频重复模式
识别常见诱因与对应处理
不是所有小文件写入都源于 bug,要区分场景:
-
日志轮转失效:如 rsyslog 或自研服务未配置 logrotate,导致
app.log不断追加且不切割。查/etc/logrotate.d/配置,并用 ls -lt /var/log/*.log 看文件修改时间是否集中于最近几小时 -
临时文件未清理:某些脚本或程序在
/tmp创建XXXX.tmp后异常退出,残留文件堆积。运行 find /tmp -name "*.tmp" -mmin -60 查最近一小时创建的临时文件 -
守护进程崩溃重启循环:如 systemd 服务设置了
Restart=always但启动即失败,每次尝试都在/var/run/写状态文件又删掉。查 journalctl -u servicename --since "1 hour ago" 看是否有密集 restart 记录 -
内核模块或驱动异常:极少数情况下,异常驱动会向
/sys或/proc某些伪文件反复写入触发调试信息。用 ps auxf 看是否有[kthreadd]子线程关联可疑模块,再查 dmesg -T | tail -30
临时止血与根治要点
先阻断空间耗尽风险,再修复逻辑:
- 立即限制进程写入能力(需 root):
echo 'deny write' > /proc/PID/status(部分内核支持)或更通用方式:
nsenter -t PID -m -p sh -c 'mount -o remount,ro /tmp'(若其只写 /tmp) - 清空已知垃圾目录(确认无业务依赖):
find /tmp -name "*.tmp" -type f -mmin +10 -delete - 根治必须检查代码或配置:确认文件 open 是否配对 close;日志是否启用异步刷盘+大小/时间双轮转;systemd 服务是否设置
StartLimitIntervalSec=0导致无限重启


















