로그를 추적하고 특정 메시지를 찾는 스크립트를 작성해야 합니다. 스크립트는 메시지가 나타날 때 로그를 계속 모니터링해야 하며, 메시지가 5초 동안 다시 나타나지 않으면 명령을 실행하는 스크립트가 필요합니다.
이것은 의사코드입니다:
후행 로그 파일에서 "오류가 발생했습니다."라는 메시지가 발견되었습니다. 이 메시지는 10~20회 반복됩니다. 메시지 스크롤이 중지된 후 5초 동안 기다렸다가 "systemctl restart myservice"를 실행합니다.
awk를 사용하려고 하는데 명령을 실행하기 전에 메시지가 스크롤을 멈출 때까지 기다리는 방법을 알 수 없습니다. 이것은 내 코드입니다.
tail -F /var/log/mylog.log | awk '
/TestString goes here/ { system("sleep 5; systemctl restart myservice") }'
답변1
bash
corutils 및 중간 파일을 사용하여 timeout
이 작업을 수행 할 수 있습니다.
server.bash를 다시 시작하십시오.
# Wait for the initial "TestString"
tail -n0 -F logfile |
while IFS= read -r; do
if [[ "$REPLY" == TestString ]]; then
break
fi
done
# See if "TestString" repeats at least every 5 seconds
touch ts
while [ -e ts ]; do
rm -f ts
timeout 5 bash -c '
tail -n0 -f logfile |
while IFS= read -r; do
if [[ "$REPLY" == TestString ]]; then
touch ts
fi
done
'
done
systemctl restart myserver
바라보다그렉의 위키Bash 읽는 동안 루프에 대한 추가 정보.