df 说分区已经 100%,du 把目录加起来却少了一截。常见原因是文件已经从目录里删掉,进程还开着它。空间要等最后一个句柄关掉才还回来。
先确认是空间满了,不是 inode 用尽:
1 | df -hT / |
IUse% 到 100%、空间还剩不少,是小文件太多,和这篇不是一回事。下面只处理空间满、删了大文件却没释放的情况。
du 不要跨到别的磁盘:
1 | sudo du -xh --max-depth=1 / | sort -h |
加出来明显小于 df 里的已用空间时,查还被打开的已删除文件:
1 | sudo lsof +L1 |
+L1 表示链接数小于 1,也就是目录项已经没了。输出里 NAME 以 (deleted) 结尾的就是。看 PID 和 COMMAND,以及 SIZE/OFF。数值大的那个句柄就是还占着空间的文件。
空间会在这个进程关掉文件或退出时释放。对应的是 systemd 服务时,重启那个单元:
1 | sudo systemctl restart 单元名.service |
数据库、消息队列这类进程,重启前按它自己的方式停,不要为了腾磁盘直接 kill -9。重启之后再跑一次 df -h,已用空间应下来。
同一条 lsof 里如果是 Docker 的 json 日志,按 容器日志写满磁盘 截断那个还在的文件。文件还在目录里时,lsof +L1 不会列出它,du 也能看到。