In passato, su sistemi Linux, sono stato in grado di troncare file di registro di grandi dimensioni e aperti (ovvero un file a cui viene attivamente scritto da un processo) utilizzando cat /dev/null > file.log
.
Tuttavia, su 10.9 (Mavericks), questo non sembra essere il caso. Ho un file da 11 GB a cui è stata eseguita l'accesso da un'applicazione, ma quando eseguo lo stesso comando con detto file, sembra che non accada nulla.
Quando provo questo su un file di dimensioni insignificanti, funziona.
Ecco qui ls -l /dev/null
:
crw-rw-rw- 1 root wheel 3, 2 Dec 16 12:49 /dev/null
Ho anche provato cp /dev/null file.log
inutilmente.
Pensando che potrei sfruttare la funzione troncata ( man 2 truncate
in Darwin), ho compilato questo ed eseguito su due file, uno di dimensioni insignificanti e l'altro il file di registro effettivo. Ancora una volta, ha funzionato contro il file banale e non ha funzionato sul registro molto più grande.
/*
* 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;
}
Il processo ritorna 0
indipendentemente dal file che uso.
du -h /tmp/file.log
risultati in11G /tmp/file.log
du
odu -h
dice? È possibile che il file sia un file sparso?