一个比较诡异的问题.
某主机磁盘满了. 执行df -h
命令, 显示:
/dev/xvda1 7.8G 7.4G 0 100% /
怀疑是某个组件的日志没有设置滚动, 导致把磁盘打爆, 遂cd
进该组件的日志目录, 空空如也. 询问同事后得知他已经rm
掉那个超大的日志文件了.
那么问题来了, 为什么日志文件删除了之后, 磁盘空间占用率仍然是100%?
遂执行sudo du -sh /* | sort -n
命令, 查看具体磁盘占用情况. 结果很奇怪, 占用磁盘最大的文件夹/usr
也不过占用了1.1G
1.1G /usr
4.0K /lib64
4.0K /media
4.0K /mnt
4.0K /opt
4.0K /srv
5.5M /etc
9.4M /sbin
9.6M /bin
12K /dev
16K /lost+found
25M /boot
28K /root
40K /tmp
60M /lib
217M /home
352K /run
384M /var
那这占用的空间究竟在什么地方...
在进入多个目录du
查询均无果之后, 转向google求助, 判断问题可能是因为日志文件被删除, 但是相关的进程还在跑, 所以导致磁盘空间没有被释放.
执行lsof |grep delete
, 得到结果显示果然是这个组件的日志文件, 但是因为进程还在跑, 所以磁盘空间继续被占用. kill
掉这个进程, 可以看到磁盘空间又回来了~
/dev/xvda1 7.8G 1.8G 5.6G 25% /
引用:
linux里的文件被删除后, 空间没有被释放, 是因为在Linux系统中, 通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink). 然而如果文件是被打开的(有一个进程正在使用), 那么进程将仍然可以读取该文件, 磁盘空间也一直被占用.
状态为deleted为标记被删除, 其实该文件并没有从磁盘中删除, 类似windows下的回收站状态.
据称当有其他进程打开某文件时文件被删除, 就会将该文件标记为deleted, 并删除其目录节点. 使用du查看时, 因为没有该删除状态文件的节点信息, 所以就不做统计, 从而导致与df的结果不一致.
若要将deleted状态文件删除, 则根据pid直接kill调相应进程即可.
引申阅读: 使用lsof处理文件恢复、句柄以及空间释放问题