W przeszłości, w systemach Linux, byłem w stanie obcinać duże, otwarte pliki dziennika (to znaczy plik, który jest aktywnie zapisywany przez proces) przy użyciu cat /dev/null > file.log
.
Jednak w wersji 10.9 (Mavericks) tak nie jest. Mam plik 11 GB, do którego loguje się aplikacja, ale kiedy wykonuję to samo polecenie z tym plikiem, wydaje się, że nic się nie dzieje.
Kiedy próbuję tego na trywialnym pliku, to działa.
Oto ls -l /dev/null
:
crw-rw-rw- 1 root wheel 3, 2 Dec 16 12:49 /dev/null
Próbowałem też cp /dev/null file.log
bezskutecznie.
Myśląc, że mógłbym skorzystać z funkcji obcinania ( man 2 truncate
w Darwin), skompilowałem to i uruchomiłem na dwóch plikach, jednym o trywialnym rozmiarze, a drugim na prawdziwym pliku dziennika. Ponownie działało to przeciwko trywialnemu plikowi i nie działało na znacznie większym dzienniku.
/*
* 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;
}
Proces powraca 0
niezależnie od używanego pliku.
du -h /tmp/file.log
wyniki w11G /tmp/file.log
du
lubdu -h
powiesz? Czy to możliwe, że plik jest plikiem rzadkim?