为什么磁盘满了,du却显示有很大的空间

  • 时间:
  • 浏览:0

今天工作遇到另几个很有意思的难题图片,跟亲戚亲戚朋友分享一下

有另几个服务器无缘无故出現故障,根据经验判断是磁盘满了,很久 登录服务器用 du -sch 发现磁盘还有20G的存储空间,再用df -h命令查都看下,磁盘居然满了。为有哪些另几个命令查出来的磁盘空间不一样呢,于是百度了下。

发现du命令是通过搜索文件来计算每个文件的大小很久 累加得到的值。而df命令通过文件系统来获取空间大小的信息。

机会用户删除了另几个正在运行的应用应用应用程序所打开的某个目录下的文件:

du命令返回的值,显示出减去了该文件后的总大小

df命令返回的值,则不显示减去该文件后的大小(文件句柄还在被使用),直到该运行的应用应用应用程序关闭了这个打开的文件(才会真正释放空间)

常见的场景是,删除了另几个很大的正在写入的tomcat的access日志,du显示的结果会把日志大小减去,而df则仍会蕴藏 该日志的大小(实际上tomcat仍引用了该文件的句柄)

对亲戚亲戚朋友的启示是,机会要删除某个access日志,何必 粗暴的rm,而要温柔的:

echo "" > access.log

怎样发现被应用应用应用程序引用着“已删除”文件呢?

lsof:list open files

使用lsof查看打开的文件

lsof | grep deleted

结果显示,另几个我的logsvr应用应用程序(跑了几个月了),和实习生写的web-server应用应用程序(实习大作业)呈现deleted情况,值得怀疑。

最终定位出,是web-server应用应用程序中的另几个:

while(pid=fork())

手误写成了:

while(pid==fork())

原因分析 while内无缘无故fork应用应用程序,直到将系统资源吃干。很久 该应用应用程序机会成了zombie应用应用程序,无法kill掉,重启开发虚拟机后,难题图片得到避免。