Ajuda com script

1. Ajuda com script

Matheus Britto
aimagem

(usa Slackware)

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.


  


2. Re: Ajuda com script

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

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

Matheus Britto
Aimagem

(usa Slackware)

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

Luís Fernando C. Cavalheiro
lcavalheiro

(usa Slackware)

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

Paulo
paulo1205

(usa Ubuntu)

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

Matheus Britto
Aimagem

(usa Slackware)

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

Matheus Britto
Aimagem

(usa Slackware)

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

Matheus Britto
Aimagem

(usa Slackware)

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?