fdを切り取った後、空き領域は回収されません。

fdを切り取った後、空き領域は回収されません。

古いログイン(削除)状態ですが、申請後

> /proc/'pid'/fd/4スペースは回収されません。

実際、ファイルサイズは0になっていますが、スペースは使い続けていますか?私は何かを忘れましたか?一種の切断操作を実行する必要がありますか?

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

実際、スペースはファイルシステムによって回収されますが、ファイルサイズは、ファイルが開いているプロセスによって次の書き込みが行われるまで一時的にゼロに縮小されます。この時点で、サイズは古いサイズと新しく作成されたデータで増加しますが、今足りないファイルの先頭が公称ゼロで埋められ、ディスク領域を占有しないファイルです。

簡単なテストでこの効果を確認できます。 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

0です。 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また、サイズの代わりにオフセットを表示します。

おすすめ記事