Quando um processo abre um arquivo, você pode fazer todo tipo de coisa para esse arquivo, como renomeá-lo, truncá-lo, até excluí-lo, mas o processo ainda terá esse arquivo aberto. Um erro comum é quando um arquivo de log usou todo o espaço em disco, um exclui o arquivo em uma tentativa de liberar espaço. No entanto, o processo de gravação no arquivo de log ainda é aberto, portanto, o espaço não é liberado. Somente quando o processo fechar o arquivo, os blocos alocados para o arquivo serão liberados. (A solução aqui é truncar o arquivo, ou seja, > logfile
.)
No seu caso, você renomeou o arquivo, mas o processo de escrever para ele não sabe ou se importa com isso.
O utilitário logcheck
tem uma opção copytruncate
para tais situações: copia o arquivo de log para o nome rotacionado e, em seguida, trunca o original. Você pode fazer o mesmo:
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
}
Uma alternativa melhor seria modificar o processo para compreender, e. o sinal SIGHUP para fechar e reabrir o arquivo de registro. Veja o comando shell trap
para lidar com isso.