не захватывает $ 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
Добавьте «--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
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, поэтому вы будете отправлять пять электронных писем, а не одно.