截断 fd 后未回收可用空间

截断 fd 后未回收可用空间

我有一个旧日志处于(已删除)状态,并且在应用后

> /proc/'pid'/fd/4该空间没有被回收。

事实上,文件的大小被清零了,但空间仍然被使用?我是不是忘记了什么?我是否必须执行某种取消链接?

lr-x------ 1 root root 64 Mar 10  16:11 4 -> /var/app/logs/app.log (deleted)
appl  'pid' appl    4r   REG  253,2         **0** 6193157 /var/app/logs/app.log (deleted)

答案1

事实上,该空间被文件系统回收,但文件的大小只是暂时减小到 0,直到仍然打开文件的进程进行下一次写入。此时大小会增加到之前的大小,加上新写入的数据,但现在您有一个文件,其中文件的开头充满了名义上的零,不占用光盘上的空间。

通过简单的测试就可以看到这个效果。创建一个大文件,每 10 秒缓慢更新一次:

$ { dd count=1k if=/dev/zero; while sleep 10;do echo hi; done; } >/tmp/big &
  [2] 1050
$ pid=$!

检查其大小和使用的磁盘空间:

$ ls -ls /tmp/big
  516 -rw-r--r-- 1 meuh users 524516 Aug 15 15:58 /tmp/big
$ du -a /tmp/big
  516     /tmp/big
$ df /tmp
  Filesystem     1K-blocks  Used Available Use% Mounted on
  tmpfs            1966228  2924   1963304   1% /tmp

文件大小为 524516 字节,516 个块,文件系统已使用 2924 个块。现在使用>命令截断文件,并立即检查大小:

$ > /proc/$pid/fd/1; ls -ls /tmp/big
  0 -rw-r--r-- 1 meuh users 0 Aug 15 15:59 /tmp/big

它为零。 10秒后再次检查:

$ ls -ls /tmp/big
  4 -rw-r--r-- 1 meuh users 524534 Aug 15 15:59 /tmp/big
$ df /tmp
  Filesystem     1K-blocks  Used Available Use% Mounted on
  tmpfs            1966228  2416   1963812   1% /tmp

可以看到空间已经被光盘回收了(从2924到使用了2416),但是文件的大小还是原来的样子,加上了一点,但是占用的块数(4,第一个数)ls -ls)很小,因此稀疏。lsof -p $pid还显示偏移量,而不是大小。

答案2

该空间不会被回收,因为仍然有一个打开的文件(并且可能由活动进程附加到末尾)。

相关内容