Este é um bug no syslog, mas ilustra um problema comum quando um exclui um arquivo enquanto ele é aberto por um programa. Quando você faz um "rm", você está removendo uma entrada de diretório, mas você NÃO está removendo o arquivo subjacente. O sistema operacional mantém uma contagem de referências ao arquivo e, na verdade, não excluirá os dados do arquivo subjacente até que a contagem de referência seja zerada. No caso de um arquivo médio, a contagem de referência do arquivo não aberto é uma (a entrada de diretório). Quando o arquivo é aberto, a contagem é incrementada para dois. Se um segundo programa abrir o mesmo arquivo, a contagem será incrementada para três. Se a entrada de diretório for excluída agora, a contagem será decrementada para dois - o que significa que o arquivo é anônimo (não tem nome), mas não será excluído até que ambos os programas tenham uma abertura - nesse caso, o sistema operacional exclua o armazenamento em disco subjacente associado ao arquivo.
Quando você exclui / var / log / mail, o criador de logs do sistema ainda tem o arquivo aberto para gravação. Se você criar um novo / var / log / mail, ele apontará para um arquivo diferente daquele que o registrador do sistema está gravando no momento. A única maneira de tornar tudo consistente é reiniciar o logger do sistema. Quando o criador de logs do sistema original é encerrado, todos os arquivos associados a ele são fechados - incluindo o log de email anônimo cuja entrada de diretório você excluiu. Quando você reiniciar o criador de logs do sistema, ele reabrirá o / var / log / mail quando precisar gravar uma mensagem de log e a manterá aberta a partir de então.
Outra maneira de descobrir isso é quando um programa em execução preenche todo o disco com dados de arquivo; o usuário exclui o arquivo muito grande, mas o espaço em disco não é liberado, porque o arquivo ainda existe e está ocupando espaço em disco, mas a entrada de diretório foi removida. Quando o programa termina (ou porque o usuário o matou ou terminou em si), o espaço em disco será recuperado porque a contagem de referência no arquivo será zerada.
O que o logger pode fazer para evitar isso é primeiro gravar a mensagem de log, verificar se a entrada do diretório do arquivo de log existe e, se ela não existir, fechar o arquivo de log original, abrir um novo e então reescreva a mensagem - para que a mensagem não seja perdida. Mas fazer tudo isso exigiria muito mais complexidade do que o logger do sistema deveria ter - pois cada mensagem que ele escreve demorará um pouco mais para ser gravada devido à verificação extra do diretório - que será bem-sucedida toda vez que o arquivo tiver sido NÃO foi eliminado.
Para entender todos os itens acima com mais clareza, o comando a seguir é instrutivo, pois descreve a chamada do sistema que executa a remoção da entrada de diretório e o decremento de referência: "man 3 unlink"