На самом деле место освобождается файловой системой, но размер файла лишь временно уменьшается до 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
также показывает смещение, а не размер.