已删除但仍在被进程占用的文件会持续占磁盘空间,需通过lsof +L1精准定位,优先优雅重载日志(如kill -USR1)、谨慎终止非关键进程,禁用批量kill,事后验证并配置logrotate等预防措施。

已删除但仍在被进程占用的文件(即“deleted”状态的文件)会持续占用磁盘空间,直到对应进程释放句柄或退出。用 lsof | grep deleted 查到大量这类文件时,不能直接删磁盘路径(路径已不存在),而应针对性地释放句柄或终止进程——关键是**安全、可控、不中断关键服务**。
确认哪些进程在占用 deleted 文件
先精准列出占用情况,避免误操作:
lsof +L1 2>/dev/null | grep -v "PID" | head -20
+L1 只显示链接数为 0 的已删文件(比 grep deleted 更准确);2>/dev/null 屏蔽权限错误;head -20 防止刷屏。重点关注 COMMAND(进程名)、PID、SIZE/OFF(实际占用空间)和 NAME(原文件路径,含 (deleted) 标识)。
优先尝试优雅释放(不杀进程)
多数情况下,无需重启服务即可释放空间:
-
日志类进程(如 nginx、rsyslog、java 应用):触发日志轮转或重载。例如:
kill -USR1 $(pgrep nginx)(nginx 重新打开日志文件);systemctl kill --signal=SIGUSR1 rsyslog -
支持 reload 的服务:用
systemctl reload xxx或service xxx reload,让其自动关闭旧句柄、打开新日志 -
检查应用自身机制:如 Log4j2 支持
LogManager.getContext().reconfigure(),Spring Boot Actuator 有/actuator/loggers接口可动态调整
谨慎终止非关键进程
若无 reload 机制,且确认进程可中断(如测试脚本、临时任务、僵尸进程),再考虑 kill:
- 先查进程用途:
ps -p PID -o pid,ppid,cmd,%mem,%cpu,tty,etime - 尝试温和终止:
kill PID(发送 SIGTERM) - 若 10 秒后仍存在且句柄未释放:
kill -9 PID(强制终止) -
禁止批量 kill 所有匹配进程:例如
lsof | grep deleted | awk '{print $2}' | xargs kill极易误杀系统关键进程(如 systemd-journald、dbus)
验证空间是否释放 & 长期预防
执行释放动作后,立即验证:
df -h / # 看根分区是否释放成功 lsof +L1 2>/dev/null | wc -l # 检查剩余 deleted 文件数
预防措施:
- 配置 logrotate 并启用
copytruncate(适用于无法 reload 的程序) - 对长运行 Java 服务,添加 JVM 参数
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M - 定期巡检:
lsof +L1 2>/dev/null | awk '$7 > 104857600 {print $0}'(筛选 >100MB 的 deleted 文件)










