linux删除文件后空间未释放的解决方法

在linux下有时会遇到一种情况,某个文件删除了,但是磁盘空间并没有释放。这是因为仍然有进程在使用此文件,其文件句柄没有被释放。
下面介绍两种方式来解决此问题。

重启服务,释放文件句柄

  1. 使用lsof找到还在使用此文件的进程。

    1
    $ lsof | fgrep "deleted"
  2. 根据上面得到的pid,进行进程重启或直接kill掉此进程,此时空间会被释放。

不重启进程的方法

  1. 使用lsof找到还在使用此文件的进程。

    1
    $ lsof | fgrep "deleted"
  2. 找到文件描述符所在地

    1
    ls -l /proc/${pid}/fd/ | fgrep "deleted"
  3. 直接截断文件描述符

    1
    2
    3
    4
    # 清空fd
    > /proc/${pid}/fd/${id}
    # 或直接调用truncate命令
    truncate -s 0 /proc/${pid}/fd/${id}

还可以进行恢复

  1. 使用lsof找到还在使用此文件的进程。

    1
    $ lsof | fgrep "deleted"
  2. 找到文件描述符所在地

    1
    ls -l /proc/${pid}/fd/ | fgrep "deleted"
  3. 进行恢复

    1
    cat /proc/${pid}/fd/${id} > /tmp/${file}

参考

  1. How to recover free space on deleted files without restarting the referencing processes?
  2. 使用lsof处理文件恢复、句柄以及空间释放问题