我有一个旧日志处于(已删除)状态,并且在应用后
> /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
该空间不会被回收,因为仍然有一个打开的文件(并且可能由活动进程附加到末尾)。