日常运维过程中,我们经常需要处理磁盘空间问题,当接到告警后,第一时间会去找那些大文件,一般比如centos,可能大文件就是 /var/log/messages。


但有的时候,会出现怎么也查不到大文件的情况,通过 du 查找的时候,统计出来的大小,跟 df 显示的占用空间对应不上。


如果通过 df -i 查看inode没有满的话,那么极有可能,是有大文件被直接rm了,但是仍然有进程打开了这个文件。


这种情况,由于进程没有退出,因此文件占用的空间并不会释放;直到进程退出,磁盘空间才会真正释放。

# 问题1:如何找到是哪个进程打开了该文件呢?


linux上,由于进程仍然存活,因此可以通过查看手机游戏卖号平台所有进程打开的fd,如果该文件已经被删除,则查看时,会显示(deleted)。


示例如下:

$ sudo find /proc/*/fd -ls | grep '(deleted)' 388609 lrwx------ 1 zerotier-one zerotier-one 64 Aug 21 00:19 /proc/29400/fd/4 -> /tmp/ibpX85Vd\ (deleted) 388610 lrwx------ 1 zerotier-one zerotier-one 64 Aug 21 00:19 /proc/29400/fd/5 -> /tmp/ibCwAgAj\ (deleted) 388611 lrwx------ 1 zerotier-one zerotier-one 64 Aug 21 00:19 /proc/29400/fd/6 -> /tmp/ibRZ5rep\ (deleted) 388612 lrwx------ 1 zerotier-one zerotier-one 64 Aug 21 00:19 /proc/29400/fd/7 -> /tmp/ibBuNEzA\ (deleted) 388616 lrwx------ 1 zerotier-one zerotier-one 64 Aug 21 00:19 /proc/29400/fd/11 -> /tmp/ibG68kpG\ (deleted)


# 问题2:如何避免这种情况?


不要直接删除该文件,而是通过将文件 truncate 的方式,释放磁盘空间。


一种方式是:

cat /dev/null > ${filename}


或者(新get!)

: > ${filename}


如此,可以快速释放空间。


# 参考文档


Find and remove large files that are open but have been deleted


更多相关文章

  1. 每个开发人员应该知道的 10 个 Linux 命令
  2. 在服务器上排除问题的头 5 分钟
  3. thinkphp内置集成workerman以守护进程方式运行
  4. linux(centos)下安装supervisor进程管理工具
  5. Windows任务管理器远比想象中的复杂
  6. 云计算时代,容器底层cgroup如何实现资源分组?
  7. WEB请求处理(2):Nginx 请求反向代理
  8. SQL执行过程详解
  9. Delphi 中的自动释放策略

随机推荐

  1. Ubuntu搭建Android交叉编译环境
  2. Android强制为自身应用设置实现多语言
  3. Execution failed for task ':app:preDeb
  4. android的logcat详细用法!
  5. Android能否在子线程刷新UI
  6. fullScreen时的软键盘监听(非重写Layout
  7. Android更新ADT到R17以后,不能用第三方ja
  8. Attribute is missing the Android names
  9. Android的电话功能介绍
  10. CardView 设置水波纹效果