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:
Vamos recorrer ao bom e velho Shell-Script para investigar se existe algum problema em andamento!
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!
A expressão usada no grep casa com valores de porcentagem acima de 80% (inclusive), logo podemos usar em um teste simples
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.
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.
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:
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:
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