여러 서버의 로그 파일을 모니터링하고 특정 키워드가 표시될 때 이메일/txt 경고를 보내는 스크립트를 작성 중입니다. 지금까지 다음을 사용하면 모든 것이 잘 작동합니다.
tail -n 0 -f "$MS01_LOG_FILE" "$MS02_LOG_FILE" | while IFS= read -r line; do
#do some fun things here
done
문제는 가끔 서버가 멈춰서 꽤 오랫동안 로그 파일에 출력이 안 되는 경우가 있는데, 로깅을 중지하라는 알림을 받고 싶습니다. 물론, 내 스크립트는 입력을 기다리는 읽기 라인을 그대로 유지합니다. 백그라운드에서 실행되는 타이머가 필요하고 라인을 읽는 것이 중단될 수 있을 것 같습니다.
답변1
긴 이야기 짧게
다음 대안이 트릭을 수행해야 합니다.
#!/bin/bash
MS01_LOG_FILE=/var/log/dmesg
MS02_LOG_FILE=/var/log/syslog
TIMEOUT=10 # modify to your liking
tail -n 0 -f "$MS01_LOG_FILE" "$MS02_LOG_FILE" | while :
do
IFS= read -t $TIMEOUT -r line
# do your funny things here
done
세부 사항
처음 인용된 내용은 help read
(참조내장 명령 "read"에 대한 bash 참조 매뉴얼)
-t timeout
전체 입력 행(또는 지정된 문자 수)이 시간 초과 초 내에 읽혀지지 않으면 읽기 시간이 초과되고 오류가 반환됩니다. timeout은 소수점 뒤에 소수 부분이 있는 십진수일 수 있습니다. 이 옵션은 읽기가 터미널, 파이프 또는 기타 특수 파일에서 입력을 읽는 경우에만 효과가 있습니다. 일반 파일에서 읽을 때는 효과가 없습니다. 읽기 시간이 초과되면 읽기는 지정된 변수 이름에 읽은 부분 입력을 저장합니다. 시간 제한이 0이면 read는 데이터 읽기를 시도하지 않고 즉시 반환됩니다. 지정된 파일 설명자에서 입력을 사용할 수 있으면 종료 상태는 0이고, 그렇지 않으면 0이 아닙니다. 시간 초과가 초과되면 종료 상태는 128보다 큽니다.
서로 다른 구현 간에는 읽기 시간 초과를 감지하는 데 사용되는 종료 상태가 128보다 크다는 보장이 없습니다(예를 들어 내 OS X bash에서는 1입니다).
이제 -t $TIMEOUT
초기 스크립트에 추가하기만 하면 솔루션의 일부만 제공됩니다. 배기관이 무엇이든 방출할 때까지 깨진 파이프가 감지되지 않기 때문입니다.
read
무한 while 루프 로 이동하면 문제가 해결됩니다.
대신 무엇을 하려는지에 따라 # do your funny things here
이제 하위 프로세스 감옥을 탈출하는 문제에 직면할 수도 있습니다.
이 경우 확인https://stackoverflow.com/questions/20558295/quit-from-pipe-in-bash