$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개의 이메일을 보내게 됩니다.