No passado, em sistemas linux, eu era capaz de truncar arquivos de log grandes e abertos (ou seja, um arquivo que está sendo gravado ativamente por um processo) usando cat /dev/null > file.log
.
No entanto, no 10.9 (Mavericks), esse não parece ser o caso. Eu tenho um arquivo de 11 GB que está sendo registrado por um aplicativo, mas quando executo o mesmo comando com esse arquivo, nada parece acontecer.
Quando eu tento isso em um arquivo de tamanho trivial, ele funciona.
Aqui está ls -l /dev/null
:
crw-rw-rw- 1 root wheel 3, 2 Dec 16 12:49 /dev/null
Eu também tentei cp /dev/null file.log
sem sucesso.
Pensando que eu poderia tirar proveito da função truncada ( man 2 truncate
em Darwin), compilei isso e executei-o em dois arquivos, um de tamanho trivial e outro no arquivo de log real. Novamente, funcionou contra o arquivo trivial e não funcionou no log muito maior.
/*
* Copyright (c) 2013 Thomas de Grivel <thomas@lowh.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
...
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <unistd.h>
int main (int argc, const char **argv)
{
int e = 0;
while (--argc) {
argv++;
if (truncate(*argv, 0)) {
e = 4;
warn("%s", *argv);
}
}
return e;
}
O processo retorna 0
independentemente de qual arquivo eu uso.
du -h /tmp/file.log
resultados em11G /tmp/file.log
du
oudu -h
diz? É possível que o arquivo seja um arquivo esparso?