제가 가지고 있는 사용자 정의 로그에 대한 분석기를 만들려고 합니다.
내 로그 파일에는 밀리초 단위의 기간 타임스탬프가 있으며 다른 파일에서 해당 로그 파일을 필터링하고 임계값 타임스탬프를 초과하는 로그가 이메일이나 IM을 통해 나에게 전송되도록 하려고 합니다.
현재 저는 여러 다른 명령과 함께 파이프되는 명령의 출력을 tail -f
변수에 할당한 다음 변수의 값을 처리하려고 합니다. 하지만 간단한 로깅조차 성공하지 못했습니다 echo
.
이것은 내가 사용하는 스크립트의 가장 간단한 형식입니다.
log=$(tail -f $logFile | grep ms | rev | cut -c 3- | rev | awk '{ if($NF > $monitorTreshold) { print $0 } }')
for q in log; do
echo "Query : $q"
done
답변1
Kusalananda가 언급했듯이 파이프는 절대 빠져나오지 않으므로 $log
가치를 얻지 못합니다.
또한 grep
버퍼링된 출력이 표시되지 않을 수도 있습니다 stdout
.
따라서 다음과 같이 데이터를 셸 루프에 직접 연결하여 실시간으로 데이터를 처리해야 합니다.
tail -f $logFile | grep --line-buffered ms | rev | cut -c 3- | rev | awk '{ if($NF > $monitorTreshold) { print $0 } }' | while read q
do
echo "Query : $q"
done
예를 들어 셸에서 bash
then 루프 내에 설정된 변수는 루프 외부에 표시되지 않습니다. 그것들은 ksh93
설정될 것입니다. 이러한 변수를 설정해야 하는 경우 bash
코프로세싱을 살펴보는 것이 좋습니다.