여러 줄의 grep 출력에서 ​​이메일 보내기

여러 줄의 grep 출력에서 ​​이메일 보내기

$ERROR가 포착되지 않고 이메일이 수신되지 않거나 테일이 종료됩니다. 내가 뭘 잘못했나요?

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

답변1

grep 명령에 "--line-buffered"를 추가합니다. 그러나 @Nick의 답변에 따르면 행당 하나의 이메일을 받게 됩니다. grep 명령에서 "-B4" 매개변수를 제거할 수도 있습니다.

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

이 시도. CentOS 6.9 VM에서 테스트한 결과 여러분이 원하는 대로 작동한다고 생각합니다. 스크립트를 처음 실행할 때 로그 파일 하단 근처에 "치명적" 메시지가 있으면 몇 개의 이메일을 받을 수 있습니다.

#!/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 

답변2

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 줄 앞에 4줄을 인쇄하므로 하나가 아닌 5개의 이메일을 보내게 됩니다.

관련 정보