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

실제로 공간은 파일 시스템에 의해 회수되지만 파일 크기는 여전히 파일이 열려 있는 프로세스에 의해 다음 쓰기가 이루어질 때까지 일시적으로만 0으로 줄어듭니다. 이 시점에서 크기는 이전 크기와 새로 작성된 데이터로 증가하지만 이제부족한파일의 시작 부분이 공칭 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

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또한 크기 대신 오프셋을 표시합니다.

답변2

아직 열려 있는 파일이 있기 때문에 공간이 회수되지 않습니다(활성 프로세스에 의해 끝에 추가될 수도 있음).

관련 정보