(Esta é uma resposta focada no Linux. Outras variantes do UNIX podem ser diferentes.)
Existem duas informações relevantes para o seu problema: (1) quais arquivos estão preenchendo seu sistema de arquivos e (2) quais processos estão gravando nesses arquivos.
Notas
Abaixo, quando eu coloco o caractere $
em comandos, provavelmente é um espaço reservado onde você precisa substituir um valor real. Espero que seja óbvio onde fazer isso e para onde não.
Quais arquivos?
Esteja ciente de que há realmente dois recursos na maioria dos tipos de sistemas de arquivos que podem ser usados por arquivos individuais: metadados (por exemplo, inodes) e dados reais. Você pode ver o número de inodes (procure no Google por uma definição, mas eles são "ponteiros" para as estruturas que compõem seus arquivos) com um comando como:
df -i
... e como você já sabe, algo assim mostrará o espaço que está sendo usado pelos dados reais:
df -h
Além disso, esteja ciente de que o espaço do sistema de arquivos pode ser ocupado por arquivos que não existem no disco. Esses arquivos ainda estão no estado aberto por algum processo, mas foram removidos (cobriremos isso abaixo).
Depois de identificar o (s) sistema (s) de arquivos completo (s), é necessário começar a procurar muitos arquivos pequenos, alguns arquivos grandes ou ambos. Ficar sem recursos de metadados geralmente é causado por ter muitos arquivos pequenos, enquanto a falta de recursos de dados reais geralmente é causada por alguns arquivos grandes. Eu gosto de usar este comando para ajudar a encontrar os arquivos grandes:
sudo find $file_system -mount -ls | awk '{print $7, $11}' | sort -rn > $output
... e este comando para ajudar a encontrar diretórios com muitos arquivos pequenos ( Atualização: : adição de terminação nula para melhorar o tratamento de nomes de arquivos):
sudo find . -mount -print0 | xargs -0n 1 dirname | sort | uniq -c | sort -rn > $output
... esteja ciente de que esses comandos podem demorar um pouco para serem executados e fazer muita E / S, dependendo. Uma vez executado, você pode ler $output
para encontrar os arquivos ou diretórios incorretos. O nome e a localização de cada um deles podem lhe dar uma dica de onde os dados estão vindo, mas requer alguma experiência com o Linux.
Depois de identificar os infratores, você pode rm $file
se livrar do problema.
Quais processos?
A maneira mais direta de encontrar os processos potencialmente preenchendo seu sistema de arquivos é executar um comando como:
fuser -c $file_system 2>/dev/null
... que lhe informará o PID dos processos que possuem descritores de arquivos abertos (arquivos e soquetes de rede) para o sistema de arquivos fornecido (a parte 2>/dev/null
elimina algumas informações desnecessárias). Você pode deduzir apenas desses PIDs cujo processo está preenchendo seu sistema de arquivos. Pesquise os processos com:
ps -ef | grep $pid
Você também pode tentar executar este comando que lhe dará ainda mais detalhes (e ajudar a identificar arquivos abertos sem nome de arquivo correspondente no disco - eu mencionei isso acima):
sudo lsof $file_system | grep $directory_filling_up
... e se você identificou um PID suspeito do comando fuser
, você pode fazer isso:
sudo lsof -p $pid
O problema com fuser
e lsof
é que eles apenas fornecem um instantâneo do sistema no momento em que você executa o comando. Se o processo ofensivo não estiver escrito quando você executá-los, você está sem sorte. Você pode contrariar isso executando-os repetidamente ao longo do tempo e salvando a saída. Isso exigirá a leitura da saída para encontrar padrões ou a criação de um programa para você. Uma alternativa é usar uma ferramenta como SystemTap . O SystemTap permite capturar todos os tipos de informações úteis e é "programável". Ele ainda vem com alguns exemplos de arquivos de origem que permitem que você veja quais processos estão gravando em quais arquivos em algum período de tempo. Seria perfeito, mas é uma ferramenta avançada e requer muito conhecimento sobre Linux.
Depois de identificar o (s) processo (s) ofensivo (s), você pode matar (e talvez reiniciá-los). Se o processo estiver associado ao sistema operacional ou a algum software bem empacotado, provavelmente haverá um mecanismo para reiniciá-los, mas dependerá da distribuição do Linux (acho que o Ubuntu permitirá que você execute algo como /etc/init.d/$init_script restart
, mas você Terei que verificar a documentação da sua distro). Caso contrário, você pode eliminá-lo com kill $pid
ou kill -9 $pid
se não estiver se comportando. Tenha cuidado ao observar como o processo estava sendo executado (por exemplo, quais eram os argumentos mostrados em ps -ef
) caso você precise reiniciá-lo (talvez seja necessário consultar a documentação desse software).