envia e-mail da saída do grep multi-alinhado

0

não pega $ ERROR e nem e-mail nem mata a cauda. o que estou fazendo errado?

tail -F --max-unchanged-stats=5 somelogfile.log | grep -B4 "FATAL" | while read ERROR
do
    echo $ERROR | mail -s 'FATAL ERROR' [email protected] && pkill -P $$ tail
done
    
por Khorem 07.06.2017 / 17:50

2 respostas

0

Adicione "--line-buffered" ao comando grep. Mas como indicado na resposta por @Nick, você receberá um email para cada linha. Pode querer apenas remover o argumento "-B4" do comando grep.

tail -F --max-unchanged-stats=5 somelogfile.log | grep -B4 --line-buffered "FATAL" | while 
read ERROR
do
    echo "$ERROR" | mail -s 'FATAL ERROR' [email protected]
done

Tente isso. Eu testei no meu CentOS 6.9 VM e acredito que faz o que você está procurando realizar. Quando o script é iniciado pela primeira vez, você pode receber alguns e-mails se houver mensagens "FATAL" perto da parte inferior do arquivo de log.

#!/bin/bash

tail -f --max-unchanged-stats=5 somelogfile.log | grep --line-buffered "FATAL" | while read ERROR
do
    grep -B4 "$ERROR" somelogfile.log \
    | mail -s 'FATAL ERROR' [email protected]
done 
    
por 07.06.2017 / 19:03
0

tail e grep provavelmente buffer stdout, então o loop while não o vê. Se você tem stdbuf (deve estar disponível no Linux, mas não tenho certeza sobre outros sistemas), tente

stdbuf -o0 tail -F --max-unchanged-stats=5 somelogfile.log | stdbuf -o0 grep -B4 "FATAL" | while read ERROR ;do ... ;done

Mas há outro problema: O while read ERROR lerá uma linha e atribuirá a ERROR toda vez que ocorrer o loop. Seu grep imprime quatro linhas antes da linha FATAL, então você estaria enviando cinco e-mails, não um.

    
por 07.06.2017 / 18:48

Tags