Pular para o conteúdo

Ajuda com script

Responder tópico
  • Denunciar
  • Indicar

1. Ajuda com script

Enviado em 16/01/2013 - 07:11h

Pessoal,

Fiz um script para gerar relatórios de algumas atividades específicas que acontecem no meu servidor de arquivos. O arquivo principal se chama report.log - que contém tudo que acontece de forma concatenada - e outro chamado report_anomêsdia.log - que contém apenas o que acontece durante o dia e é criado um novo a cada dia (report_`date +%Y%m%d`.log). Tenho que separar do relatório diário, partes baseado em alguns critérios, o que consegui fazer com o script abaixo de forma bem simples e rápida.


#!/bin/bash

report="/private/var/log/pms"
log="report_`date +%Y%m%d`.log"

cat $report/$log | while read line
do
photo="${line%_*_*}"
photo="${photo##*_}"
echo $line | grep $photo >> $report/$photo.log
done
Até ai tudo super bem. O problema aconteceu quando acrescentei a parte de envio de mail - como descrito baixo - antes do done.


file=`ls -1 $report/$photo.log | wc -m`
if [ $file -eq 20 ]
then
`mail -s "Subject" mail.server.ext < $report/$photo.log`
elif [ $file -eq 19 ]
then
`mail -s "Subject" mail.server.ext < $report/$photo.log`
.
.
.
fi
Ao invés de ser enviado apenas uma única mensagem com o conteúdo do arquivo gerado, chegam várias mensagem com os pedaços do arquivo. O motivo disso acontecer é bem óbvio, já que está dentro do loop. O problema é como solucionar. §;-)
Usei o wc -m porque cada arquivo gerado pelo script tem nome diferente e já testei e cada um tem uma contagem distinta, mas se tiver outra forma de fazer isso - e que funcione tão bem quanto - estou aberto à sugestões.

Alguém poderia indicar um caminho para fazer o que preciso?

Agradeço desde já.

Abraços,

Matheus.

Responder tópico

2. Re: Ajuda com script

Enviado em 16/01/2013 - 09:21h

Faz o script criar o arquivo normalmente sem enviá-lo por e-mail e apenas ao final dele acrescente mais um if-then-else-fi contendo os parâmetros para decidir se ele envia o arquivo ou não.

3. Re: Ajuda com script

Enviado em 16/01/2013 - 16:41h

lcavalheiro,

Mas ai é que está o problema. Fora do loop ele apresenta erros, por não identificar o $photo.log. §:-(

4. Re: Ajuda com script

Enviado em 16/01/2013 - 23:28h

Aimagem escreveu:

lcavalheiro,

Mas ai é que está o problema. Fora do loop ele apresenta erros, por não identificar o $photo.log. §:-(
Usa o loop para compor um arquivo qualquer com os dados que seriam enviados por e-mail, e após o loop envie o arquivo.

5. Re: Ajuda com script

Enviado em 17/01/2013 - 01:01h

Aimagem escreveu:

lcavalheiro,

Mas ai é que está o problema. Fora do loop ele apresenta erros, por não identificar o $photo.log. §:-(
No tópico que você criou anteriormente eu expliquei exatamente como você deveria fazer para não ter tal tipo de problema.

6. Re: Ajuda com script

Enviado em 17/01/2013 - 03:00h

paulo1205 escreveu:

No tópico que você criou anteriormente eu expliquei exatamente como você deveria fazer para não ter tal tipo de problema.
Paulo,

Não havia me lembrado disso. Obrigado pela dica.
O problema agora é que a checagem do tamanho dos arquivos parou de funcionar. O comando wc -m está contando todos os arquivos juntos e não separados para poder comparar. Alguma idéia de como solucionar isso? Tem horas que a cabeça dá um nó…

Abraços,

Matheus.

7. Re: Ajuda com script

Enviado em 17/01/2013 - 03:05h

lcavalheiro escreveu:

Usa o loop para compor um arquivo qualquer com os dados que seriam enviados por e-mail, e após o loop envie o arquivo.
lcarvalho,

Mas o script já gera os arquivos necessários. O que preciso é checar se cada arquivo tem um tamanho certo de caracteres no nome e dependendo do tamanho, enviar para um determinado mail. O comando estava funcionando super bem, agora parou de funcionar e contar o total de caracteres de todos os arquivos. Alguma idéia de como solucionar isso?

Abraços,

Matheus.

8. Re: Ajuda com script

Enviado em 17/01/2013 - 03:07h

Atualizando…


logdir="/private/var/log"
logfile="$logdir/report_`date +%Y%m%d`.log"

if [ -e $logfile ]
then
    exec 3< <(cat $logfile)
    while read file <&3
    do
        name="${file%_*_*}"
        name="${name##*_}"
        echo $file | grep $name >> $logdir/$name.log
    done
    exec 3<&-
fi
Funcionando perfeitamente bem para gerar os arquivos que preciso - antes também estava funcionando, mas o Paulo me lembrou de corrigir uma pequena falha…
Agora uma coisa estranha que anda acontecendo é que se der um echo $name ele me mostra apenas o último arquivo criado e não todos os que foram criados. Porque isso está acontecendo e como resolvo isso?
Tem como direcionar a informação da criação do arquivo para um variável qualquer para que depois possa fazer a comparação para saber para onde o arquivo será enviado? Tipo: se criar um arquivo chamado recife.log, enviar para um email, se for sampa.log para outro mail?

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder