有时候你会发现 Linux 服务器的磁盘空间快满了,用df -h一看,根目录占用特别大,但你在系统里到处找,都找不到哪个文件占了这么多空间。这种情况通常是因为:有些文件已经被删除了,但进程还在占用它们,导致系统无法真正释放磁盘空间。这些文件在正常目录里看不到,属于 “隐藏占用”。
一、先找出那些 “删不掉的隐藏文件”
Linux 把每个进程打开的文件都放在/proc/进程号/fd下面。如果一个文件被删除了,但进程还在使用它,它会显示为 (deleted)。
你可以用下面的命令查看所有这类隐藏文件:
sudo find /proc/*/fd -ls 2>/dev/null | grep deleted | awk '{size=$1; $1=""; print size, $0}' | sort -k1 -h | numfmt --field=1 --to=iec-i --suffix=B --format="%9f"
这条命令会列出所有被进程占用但已经删除的文件,包括它们的大小、路径和对应的进程。
二、找到占用这些文件的进程
上一步你会看到很多类似:
811MiB /proc/962692/fd/3 (deleted)
这里的 962692 就是占用文件的进程 ID(PID)。
为了方便提取 PID,你可以用下面的命令,它会自动整理并显示所有占用隐藏文件的进程号:
sudo find /proc/*/fd -ls 2>/dev/null | grep deleted | awk '{print $1 " " $11}' | sort -h | numfmt --to=iec-i --suffix=B --format="%9f" | grep -oP '/proc/\K\d+(?=/)'
这条命令会输出一串 PID,比如:
962692
12345
7890
这些就是正在占用隐藏文件的进程。
三、终止进程,释放磁盘空间
找到进程后,你只需要重启或终止这些进程,系统就会自动释放被占用的磁盘空间。
你可以用:
kill <PID>
如果进程无法正常退出,再用强制终止:
kill -9 <PID>
注意:
终止进程前,最好确认这些进程不是关键业务(比如数据库、Nginx、核心服务)。如果是业务进程,重启服务即可,不要直接 kill -9。
四、一键清理(慎用)
如果你确认这些进程都可以安全终止,也可以用一条命令自动清理所有占用隐藏文件的进程:
sudo find /proc/*/fd -ls 2>/dev/null | grep deleted | awk '{print $1 " " $11}' | sort -h | numfmt --to=iec-i --suffix=B --format="%9f" | grep -oP '/proc/\K\d+(?=/)' | xargs kill -9
五、验证磁盘空间是否释放
清理完后,再运行:
df -h
根目录的存储占用比率变小了。
