отправка электронной почты из многострочного вывода grep

не захватывает $ ERROR, электронную почту и не убивает хвост. что я делаю не так?

tail -F --max-unchanged-stats=5 somelogfile.log | grep -B4 "FATAL" | while read ERROR
do
    echo $ERROR | mail -s 'FATAL ERROR' admin@someserver.com && pkill -P $$ tail
done
0
07.06.2017, 18:50
2 ответа

Добавьте «--line-buffered» в команду grep. Но, как указано в ответе @Nick, вы получите электронное письмо для каждой строки. Может потребоваться просто удалить аргумент «-B4» из команды grep.

tail -F --max-unchanged-stats=5 somelogfile.log | grep -B4 --line-buffered "FATAL" | while 
read ERROR
do
    echo "$ERROR" | mail -s 'FATAL ERROR' admin@someserver.com
done

Попробуйте это. Я тестировал свою виртуальную машину CentOS 6.9, и я считаю, что она делает то, что вы хотите достичь. При первом запуске сценария вы можете получить несколько сообщений электронной почты, если в нижней части файла журнала есть сообщения «FATAL».

#!/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' admin@someserver.com
done 
0
28.01.2020, 04:44

tail и grep, вероятно, буферизуют стандартный вывод, поэтому цикл while его не видит. Если у вас есть stdbuf(, он должен быть доступен в Linux, но я не уверен в других системах ), попробуйте

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

Но есть еще одна проблема. :while read ERRORбудет считывать одну строку и присваивать ей значение ERROR каждый раз в цикле. Ваш grep печатает четыре строки перед строкой FATAL, поэтому вы будете отправлять пять электронных писем, а не одно.

0
28.01.2020, 04:44

Теги

Похожие вопросы