Fiz essa pergunta em duas entrevistas consecutivas, mas após algumas pesquisas e verificações com vários administradores de sistemas, não recebi uma boa resposta. Gostaria de saber se alguém pode me ajudar aqui.
Um servidor está sem espaço em disco. Você percebe um arquivo de log muito grande e determina que é seguro removê-lo. Você exclui o arquivo, mas o disco ainda mostra que está cheio. O que causaria isso e como você o remediaria? E como você descobriria qual processo está gravando esse enorme arquivo de log?
linux
shell
log-files
disk-space-utilization
ewwhite
fonte
fonte
Respostas:
Essa é uma pergunta comum de entrevista e uma situação que surge em vários ambientes de produção.
As entradas de diretório do arquivo foram excluídas, mas o processo de registro ainda está em execução. O espaço não será recuperado pelo sistema operacional até que todos os identificadores de arquivo tenham sido fechados (por exemplo, o processo tenha sido eliminado) e todas as entradas de diretório removidas. Para encontrar o processo de gravação no arquivo, você precisará usar o
lsof
comandoA outra parte da pergunta pode às vezes ser "como você limpa um arquivo que está sendo gravado sem interromper o processo?" Idealmente, você "zera" ou "trunca" o arquivo de log com algo como, em
: > /var/log/logfile
vez de excluir o arquivo.fonte
fuser
.no-clobber
configurou, tente:>| /var/log/logfile
df
Dizdu
que você está sem espaço, diz que mal está usando nenhuma. O que está causando isso e por que as duas ferramentas não concordam?"> /var/log/file
do espaço em disco ainda estiver em 100%? O arquivo de log parece estar vazio ... mas somente após reiniciar o programa que grava nesse arquivo de log, o espaço é recuperado. Existe uma maneira de recuperar o espaço em disco sem reiniciar o programa?Ainda há outro link para o arquivo (link físico ou identificador de arquivo aberto). A exclusão de um arquivo exclui apenas a entrada do diretório; os dados e o inode do arquivo permanecem até a última referência a ele ser removida.
É uma prática comum para um serviço criar um arquivo temporário e excluí-lo imediatamente, mantendo o arquivo aberto. Isso cria um arquivo no disco, mas garante que o arquivo será excluído se o processo terminar de forma anormal e também impede que outros processos pisem acidentalmente no arquivo. O MySQL faz isso, por exemplo, para todas as suas tabelas temporárias em disco. O malware geralmente usa táticas semelhantes para ocultar seus arquivos.
No Linux, você pode acessar convenientemente esses arquivos excluídos como
/proc/<pid>/fd/<filenumber>
.fonte
Eu não sou um administrador de sistemas, mas pelo que reuni no Unix.SE, um sistema Linux na verdade não exclui um arquivo (marque o espaço como livre / reutilizável) depois que ele é desvinculado até que todos os descritores de arquivo que apontam para eles tenham foi fechado. Portanto, para responder à primeira parte, o espaço ainda não está livre porque um processo ainda está sendo lido. Para responder à segunda, você pode ver com qual processo está usando o arquivo
lsof
.fonte
Uma resposta alternativa além da óbvia resposta de vínculo físico / arquivo aberto: esse arquivo é um arquivo (muito) escasso, como
/var/log/lastlog
no RHEL, que na verdade não estava ocupando tanto espaço. A exclusão teve muito pouco impacto; portanto, você precisa examinar o próximo arquivo maior.fonte
Se o processo de gravação do arquivo for raiz, ele será gravado no espaço de arquivo reservado do superusuário. O sistema de arquivos possui esse espaço para manter um sistema operacional, caso uma tarefa do usuário preencha o disco. Esse espaço (imho por padrão 5%) é invisível para muitas ferramentas.
lsof pode mostrar qual processo bloqueou o arquivo, portanto, ele está gravando nele.
fonte
Além do arquivo ser aberto por um processo, um segundo caso é quando você possui um sistema de arquivos que suporta instantâneos como
btrfs
ouZFS
.Por exemplo, você tira uma captura instantânea com esse enorme arquivo de log existente. Se você excluir o arquivo agora, excluirá apenas o delta. E o delta é excluído apenas quando o arquivo não está em uso.
Veja também:
https://superuser.com/questions/863588/how-to-delete-a-file-in-all-snapshots-on-a-btrfs-system
ZFS: Removendo arquivos de instantâneos?
Um terceiro caso é quando você possui um sistema de arquivos que suporta a desduplicação no nível de bloco e a maior parte do arquivo é idêntica a outro arquivo. Não espero que isso aconteça para um log, a menos que você tenha um contêiner ou VM que esteja enviando os logs para um contêiner syslog ou VM que compartilhem o mesmo FS para que o conteúdo do log seja idêntico.
fonte