quarta-feira, 13 de junho de 2007

Avaliando Espaço em Disco

Um problema comum de qualquer administrador é o espaço em disco. As politicas de quotas geralmente resolvem boa parte destes problemas, é claro, mas nem sempre são suficientes.

O caso: pensando de forma genérica, diversas pessoas criam diretórios de trabalho dentro do bom e velho/local e, com o passar do tempo, esta partição pode lotar e comprometer o trabalho de todos. Politicas de uso racional do espaço em disco podem ser aplicadas mas as vezes a coisa pode sair do controle -- nesse caso o prejuizo pode ser grande.

Os diretorios possuem o seguinte formato:

/local/diretorio/algum_nome_identificador.vws


Vamos recorrer ao bom e velho Shell-Script para investigar se existe algum problema em andamento!

$ df /local
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdb1 35001508 11330452 21893064 35% /local


Vejam só: apenas 35% da partição está sendo ocupada e isso não representa risco neste momento. Se estivesse acima de 80% alguma medida perventiva deveria ser tomada. Como podemos fazer este teste? Existem varias formas, vou usar o poder das expressões regulares para isso!

$ seq -f"%g%%" 10 5 100 | grep -E '(100|[89][0-9])%'

80%
85%
90%
95%
100%


A expressão usada no grep casa com valores de porcentagem acima de 80% (inclusive), logo podemos usar em um teste simples

 if df /local | grep -qE '(100|[89][0-9])%' ; then
echo '/local [quase] lotado!'
else
echo '/local seguro (menos de 80%)'
fi


Simples, não? Poderia ter usado os operadores && e || mas não queria sacrificar a legibilidade do código.

Agora vem a parte divertida: e se o /local estiver ficando cheio, vamos fazer o que?

Quando vc não tem a responsabilidade de apagar arquivos desnecessários, o maximo que vc pode fazer é avisar os responsáveis. Elaborar um relatório com os 'problemas' encontrados e enviar por email usando shell script é simples.

Vamos usar o du para calcular o espaço gasto em cada diretório e o sort para ordenar do maior para o menor tamanho total.

$ du -bs /local/diretorio/* 2>&- | sort -nr 
3765643919 /local/diretorio/nonono001.vws
2290883178 /local/diretorio/nonono002.vws
2067295469 /local/diretorio/nonono003.vws
932165874 /local/diretorio/nonono004.vws
...
267271 /local/viewstore1/nonono999.vws


Facil heim ? Se vc se dá ao trabalho de ler as man pages do du e do sort, basta fazer algumas experiências até obter o resultado que mais lhe agrada. Por exemplo, uma atitude interessante seria listar os X maiores diretórios e enviar por email para o administrador.

$ du -bs /local/diretorio/* 2>&- | sort -nr | head -10 > /tmp/arquivo.log 
$ mailx -S "Lista dos 10 maiores diretorios" "administrador@server" < /tmp/arquivo.log


Talvez vc pergunte o motivo pelo qual eu utilizo um arquivo temporário: caso o envio do email dê algum problema, é possivel recuperar a lista.

Um script para rodar na cron e enviar o email de forma automatizada teria este formato:

#!/bin/bash
# Autor: Tiago Peczenyj - 13/jun/2007
# Script parametrizado para avaliar tamanho de alguns diretorios

X=10
DIR=/local/diretorio
EMAIL=administrador@server
SUBJECT="Lista dos ${X} maiores diretorios em $(date +"%Y%m%d" )"
if df ${DIR} | grep -qE '(100|[89][0-9])%' ; then
du -bs ${DIR}/* 2>&- | sort -nr | head -${X} > /tmp/arquivo.log
mailx -S "${SUBJECT}" ${EMAIL} < /tmp/arquivo.log
fi


O script parece simples, entretanto algo simples como informar o usuario dono de cada diretório é muito mais complexo. A minha solução foi esta:

paste -d '\t' <(du -bs /local/viewstore1/* 2>&-) \
<(ls -l /local/viewstore1 | awk '/^d/{print $3}') | awk '{
OFS="\t" ; print $1,$3,$2
}'| sort -nr

Nenhum comentário: