在Linux服务器运维中,经常会遇到磁盘使用率报警,但查找大文件时却找不到对应内容的情况。这是因为某些文件被删除后,仍有进程持有它们的文件句柄,空间就不会被系统回收。使用lsof配合grep deleted能够看到这些幽灵文件。

为什么已删除文件还占用空间
当进程以文件方式打开一个文件后,如果文件被rm删除,目录项没了,但只要进程不关闭句柄,磁盘上的数据块就依然被占用。lsof会把这些文件标记为(deleted)。
如何查看这类文件
我们可以用下面的命令列出当前系统中已被删除但仍被进程占用的文件:
lsof | grep deleted
输出中包含了文件大小、占用进程PID和文件名等信息。如果要按空间排序,可以结合awk处理。
自动释放空间的脚本
下面是一个简单的Shell脚本,它会找出占用超过100M的已删除文件,并清空对应进程的文件描述符以释放空间。
#!/bin/bash
# 阈值单位MB
threshold=100
lsof | grep deleted | awk 'NR>0 && $7 ~ /^[0-9]+$/ && ($7/1024/1024)>'$threshold' {print $2, $4, $7, $9}' | while read pid fd size file
do
echo "处理PID:$pid FD:$fd 大小:$size 文件:$file"
# 通过清空文件描述符释放空间
if [ -e /proc/$pid/fd/$fd ]; then
> /proc/$pid/fd/$fd
echo "已清空描述符释放空间"
fi
done
使用说明与注意点
- 脚本中以
> /proc/$pid/fd/$fd方式清空文件,不会中断进程,但文件内容会丢失,仅适用于日志类文件。 - 如果进程不允许清空,可考虑重启对应服务来释放。
- 运行脚本需要足够权限,通常要用root执行。
总结
通过lsof grep deleted快速定位已删除未释放的文件,再配合上述脚本,可以有效解决因幽灵文件导致的磁盘空间不足问题,提升运维效率。
lsofgrep_deleted磁盘空间释放脚本Linux修改时间:2026-07-25 06:36:14