Как только процесс открывает файл, вы можете делать с этим файлом все, что угодно, например, переименовывать его, усекать и даже удалять, но процесс все равно будет открывать этот файл. Распространенной ошибкой является то, что когда файл журнала израсходовал все дисковое пространство, его удаляют, пытаясь освободить место. Однако процесс записи в файл журнала все еще открыт, поэтому место не освобождается. Только когда процесс закроет файл, блоки, выделенные для файла, будут освобождены. (Обходным путем здесь является усечение файла, т. е. > logfile
.)
В вашем случае вы переименовали файл, но процесс записи в него не знает и не заботится об этом.
У утилиты logcheck
есть опция copytruncate
для таких ситуаций :она копирует лог-файл в повернутое имя, а затем усекает оригинал. Вы можете сделать то же самое:
rotateLog() {
currentsize=$(du -k $LOGFILE | cut -f1)
if [ $currentsize -ge $MAX_LOGFILE_SIZE ]; then
ROTATEDLOG=$LOGFILE.$(date +%Y%m%d%H%M%S)
cp -p $LOGFILE $ROTATEDLOG && true > $LOGFILE
fi
}
Лучшей альтернативой было бы изменить процесс, чтобы понять, например.сигнал SIGHUP, чтобы закрыть и снова открыть файл журнала. См. команду оболочки trap
для обработки этого.