[UNIX AIX 6.1] Script de find + xargs + rm apresentando problema

1. [UNIX AIX 6.1] Script de find + xargs + rm apresentando problema

Kdu Bonalume
kdubmartins

(usa Outra)

Enviado em 26/02/2015 - 10:41h

Pessoal, bom dia!
Criei um script que roda por Korn Shell para varrer alguns filesystems e remover arquivos de uma extensão específica não acessados nos últimos 300 dias, havendo a possibilidade de desconsiderar algumas pastas de pessoas cujos arquivos jamais podem ser deletados.

Muito bem. Após implantado ele apresentou um comportamento estranho, conforme log. Está mudando o conteúdo da variável do loop no echo "Vasculhando o diretorio " $i >> ${LOG} , mas depois ele mostra resultados como se estivesse parado no primeiro item do loop.
Agradeço qualquer ajuda!


#########################################################
# SHSMEXPURGO.sh #
# ROTINA DE EXPURGO DE ARQUIVOS #
# DESENVOLVIDO EM 10/Fev/2015 #
# AUTOR: Carlos Eduardo Bonalume Martins Junior #
#########################################################

#Array com os diretorios a serem analisados
set -A DIRS '/crmusers' '/ci_mensur' '/telemetria' '/sasdata' '/home'

#Pastas em que a rotina nao deve realizar expurgo:
set -A DIR_IGNORE '/crmusers/cr312390/*'

#Parametro de quantidade de dias a serem considerados
qtddias=300

#Parametro do nome e caminho do arquivo de log
LOG="/sasdata/log_expurgo_sas7bdat.txt"

#Abre o arquivo de log sobrescrevendo versoes anteriores
echo "\n" > ${LOG}
echo "Rotina de expurgo de tabelas SAS (*.sas7bdat)" >> ${LOG}
echo "Data e Hora da ultima execucao:" $(date +%d/%m/%Y" "%H:%M:%S) >> ${LOG}

#Variavel que monta as condicoes de diretorios a desconsiderar
desconsidera=""
for i in "${DIR_IGNORE[@]}"
do
desconsidera="${desconsidera} | grep -v $i " >> ${LOG}
done

#Joga os valores das variáveis no log
echo "\n" >> ${LOG}
echo "Pastas a pesquisar: ${DIRS[@]}" >> ${LOG}
echo "Pastas a desconsiderar: ${DIR_IGNORE[@]}" >> ${LOG}
echo "Quantidade de dias de criterio: ${qtddias}" >> ${LOG}
echo "Linha de comando das pastas desconsideradas: ${desconsidera}" >> ${LOG}

for i in "${DIRS[@]}"
do
#incluir log da pasta pesquisada
echo "\n" >> ${LOG}
echo "Vasculhando o diretorio " $i >> ${LOG}

#Lista os arquivos no log
echo "Arquivos que serao removidos:" >> ${LOG}
eval find $i -type f -name "*.sas7bdat" -depth -atime +${qtddias} -long ${desconsidera} | xargs -I {} echo {} >> ${LOG}

#executa o expurgo e grava os erros no log
echo "\n" >> ${LOG}
echo "Log dos expurgos realizados:" >> ${LOG}
eval find $i -type f -name "*.sas7bdat" -depth -atime +${qtddias} -long ${desconsidera} | xargs -I {} rm -rf {} >> ${LOG}
done

#Fim do processamento
echo "\n" >> ${LOG}
echo "Termino do expurgo de tabelas SAS" >> ${LOG}
echo "Data e Hora do termino:" $(date +%d/%m/%Y" "%H:%M:%S) >> ${LOG}

#FIM DA ROTINA


--------
Log de execução:

Rotina de expurgo de tabelas SAS (*.sas7bdat)
Data e Hora da ultima execucao: 24/02/2015 19:38:07


Pastas a pesquisar: /crmusers /ci_mensur /telemetria /sasdata /home
Pastas a desconsiderar: /crmusers/cr312390/*
Quantidade de dias de critério: 300
Linha de comando das pastas desconsideradas: | grep -v /crmusers/cr312390/*


Vasculhando o diretorio /crmusers
Arquivos que serao removidos:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿAÙ›Z
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿÀÅ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿDƒšDƒšDƒš
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:R@
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:âÀ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:À
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:=ø


Log dos expurgos realizados (editado, diminuindo as linhas):


Vasculhando o diretorio /ci_mensur
Arquivos que serao removidos:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿAÙ›Z
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿÀÅ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿDƒšDƒšDƒš
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:R@
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:âÀ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:À
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:

Log dos expurgos realizados:


Vasculhando o diretorio /telemetria
Arquivos que serao removidos:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿAÙ›Z
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿÀÅ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿDƒšDƒšDƒš
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:R@


Log dos expurgos realizados:


Vasculhando o diretorio /sasdata
Arquivos que serao removidos:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿAÙ›Z
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿÀÅ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿDƒšDƒšDƒš
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:

Log dos expurgos realizados:


Vasculhando o diretorio /home
Arquivos que serao removidos:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿAÙ›Z
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿÀÅ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿDƒšDƒšDƒš
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:ìÿ
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:
/crmusers/cr312390/base_boavista_20130430_pv.sas7bdat:

Log dos expurgos realizados:


Termino do expurgo de tabelas SAS
Data e Hora do termino: 24/02/2015 19:41:37




  


2. Re: [UNIX AIX 6.1] Script de find + xargs + rm apresentando problema

Paulo
paulo1205

(usa Ubuntu)

Enviado em 01/03/2015 - 20:17h

Seria bom deixar a indicação de que o script deve ser rodado com ksh na primeira linha do arquivo, num formato como segue.

#!/bin/ksh 


Nos logs que você mostrou, eu notei que todos os nomes impressos estão justamente no diretório que aparentemente deveria ser ignorado para efeitos do script em questão. Isso me leva a crer que há algum problema ou na invocação do find ou no eval que a encapsula, como se aquele(s) greps não estivessem fazendo efeito e, pior, estivessem sendo colocados como pontos de busca do próprio find. E aquele asterisco que você colocou como parte da especificação de arquivos a desconsiderar provavelmente não faz o que você gostaria dentro do grep (não deveria ser “.*”?) e possivelmente agrava o possível problema que mencionei acima.

Por falar nos logs, parece-me que o mesmo arquivo é listado um monte de vezes, como se fosse a saída do comando grep. Intriga-me saber qual string ele está procurando, dado o aparente lixo que vem depois do nome do arquivo.

Não me agrada muito a ideia de rodar o mesmo comando múltiplas vezes, especialmente com um comando custoso como o find. No entanto, você acaba fazendo isso, pois chama o find uma vez para mostrar o que vai ser apagado e outra para efetivamente (tentar) apagar. Penso que essas duas fases são redundantes, mas se você quiser mesmo tê-las separadas, ainda pode chamar o find apenas uma vez, jogando o resultado num arquivo de trabalho temporário -- é mais rápido e barato reler um arquivo do que varrer um diretório.

Na linha de comando do find, você já trabalha com o predicado -type f, implicando que só arquivos serão apresentados como resultado. Desse modo, o argumento -r do rm é desnecessário. Desnecessária também é a opção -long do find, pois ela só tem valor em conjunto com a função -ls, que você não está usando. A opção -depth também não tem serventia, dado o predicado usado para mostrar só arquivos.


3. Re: [UNIX AIX 6.1] Script de find + xargs + rm apresentando problema

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/03/2015 - 12:30h

Só complementando, tanto o find quanto o xargs do AIX são um tanto limitados. Entre outros problemas está a dificuldade em lidar com arquivos cujos nomes contêm espaços ou quebras de linha (que, por incrível que pareça, são válidos num nome de arquivo -- os únicos caracteres que não são válidos são o byte nulo e a barra (“/”), que separa nomes de diretórios). Você pode tentar colocar um sed no meio da pipeline para providenciar o escape dos caracteres potencialmente problemáticos, mas eu temo que isso ainda possa causar algumas surpresas de vez em quando. Se você tiver ou puder ter o find e o xargs da GNU (parte do pacote coreutils), eu acho mais seguro seguir com eles, usando a ação -print0 do find e as opções -0 e -r do xargs.

Se você só puder usar ferramentas nativas do AIX, talvez a melhor opção seja deixar o xargs de lado, e usar a ação -exec do find. Isso definitivamente é mais seguro, mas é mais caro, pois o comando especificado será executado uma vez para cada arquivo selecionado. Isso implica, para cada arquivo, o custo de criar um processo novo, invocar o executável nesse processo novo, aguardar sua conclusão e tratar a terminação, antes de seguir para o próxima arquivo. Se você tiver poucos arquivos e um servidor relativamente ocioso, com discos rápidos e bastante cache, o impacto pode não ser significativo; mas a presença de muitos arquivos numa máquina ocupada, num diretório montado por NFS (que não tem cache) pode causar algum desconforto.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts