Ué?! ‘rm’ não apaga arquivos?

Há algum tempo topei com uma característica ‘pertubadora’ no Linux. Eu havia apagado um grande arquivo de log (de uns 40 GB de tamanho), mas o espaço em disco disponível não aumentou em 40 GB! De fato, o espaço em disco continuou do mesmo tamanho como se eu não tivesse apagado o arquivo. O que aconteceu?

Eis o fato: Arquivos que ainda estão abertos “pertencem” aos processos que os abriram/criaram. Se você apaga um arquivo ainda aberto apenas a referência ao arquivo será apagada! Ele ainda continuará existindo até que o processo que o mantém aberto feche-o. Para demonstrar, eis um programinha:

/* usage.c */

#include <stdio.h>

#define BUFFER_LENGTH 1024*1024
char buffer[BUFFER_LENGTH];

int main(int argc, char *argv[])
{
  FILE *f;

  if ((f = fopen("test.dat", "wb")) == NULL)
  {
    fprintf(stderr, "Cannot create file.\n");
    return 1;
  }

  /* Escreve 1 GB de "lixo" no arquivo. */
  fwrite(buffer, BUFFER_LENGTH, 1024, f);

  printf("Hit <ENTER>\n");
  getc(stdin);

  fclose(f);

  printf("File closed!\n");
  return 0;
}

Com isso criamos um arquivo test.dat contendo 1 GB de lixo e esperamos pelo usuário teclar <ENTER> antes de fechar o arquivo. Agora dêem uma olhada nisso:

$ gcc -o usage usage.c
$ df -m .
Filesystem   1M-blocks  Used   Available Use% Mounted on
/dev/sda1    461036     43991  393626    11%  /

$ ./usage &
[1] 4065
Hit <ENTER>
^C
[1]+  Stopped                 ./usage

$ df -m .
Filesystem   1M-blocks  Used   Available Use% Mounted on
/dev/sda1    461036     45015  392602    11%  /

$ ls
test.dat  usage  usage.c
$ rm test.dat
$ ls
usage  usage.c
$ df -m .
Filesystem   1M-blocks  Used   Available Use% Mounted on
/dev/sda1    461036     45015  392602    11%  /
$ lsof | grep test.dat
usage  4065  frederico  3w  REG  8,2 1073741824 20715281 /home/frederico/tests/usage/test.dat (deleted)

$ fg 1
./usage
Teclei <ENTER> aqui.
File closed!

$ df -m .
Filesystem   1M-blocks  Used   Available Use% Mounted on
/dev/sda1    461036     43991  393626    11%  /

Reparou que após a execução de ./usage ficamos com 1024 blocos de 1 MB a menos, como era esperado, e mesmo após apagar o arquivo não recuperamos o espaço (o comando lsof nos diz, explicitamente, que o arquivo foi deletado!)? Somente depois que o arquivo foi fechado é que o sistema nos dá o espaço de volta…

Parece estranho, mas isso faz todo sentido. Se o arquivo aberto por outro processo fosse apagado, toda a sorte de problemas aconteceria com o “dono” do arquivo.

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s