tail -f를 사용하여 로그를 모니터링할 때 예외 처리

tail -f를 사용하여 로그를 모니터링할 때 예외 처리

모니터링을 수행하기 위해 스크립트를 호출하는 기본 스크립트가 있습니다.

로그가 없거나 더 이상 액세스할 수 없는 예외를 포착하려고 합니다.

tail -f-F로그 이름은 현재 날짜를 따라 지정되므로 대신 사용하세요 .

traptail -f작동할 수도 있지만 모니터링되는 로그가 더 이상 존재하지 않는 경우 어떤 신호가 반환되는지 잘 모르겠습니다 .

그렇지 않으면 기본 스크립트에서 루프 검사를 수행해야 합니까 [ -r $Log]?

답변1

프로그램은 tail파일이 삭제되었음을 알지 못합니다. 이를 위해서는 다른 것이 필요합니다. 이것inotifyLinux의 기능을 통해 응용 프로그램은 파일 이벤트에 대한 알림을 받을 수 있습니다. 대부분의 다른 대학에도 비슷한 기능이 있습니다. 다음 명령은 file.log삭제 시 알림을 인쇄합니다.

inotifywait -e delete file.log

답변2

방금 주요 문제가 어디에 있는지 확인하려고 시도했습니다.

tail -f기존 파일에 대해 작업을 수행한 다음 파일을 삭제하면 tail이 사실을 전혀 알 수 없습니다. 이유는 간단합니다. tail -f파일의 내용을 참조하는 읽기 전용 파일 핸들을 엽니다. 이제 파일이 사라지면 메타디렉터리 항목만 사라집니다. 마지막 FH가 닫힐 때 할당이 해제됩니다. tail이 경우가 그렇습니다.

그래서 당신은해야합니다

  • tail -f자체 백그라운드 프로세스에 넣고 PID를 기억하세요 .
  • 파일 존재를 모니터링하기 위해 다른 프로세스를 시작합니다(매초마다 while 루프 또는 유사한 것).
  • 이 모니터가 파일이 사라진 것을 발견하면, 테일 프로세스에서 사용할 수 있는 신호를 선택한 신호를 사용하여 해당 테일 프로세스의 PID로 보내야 합니다 trap.

답변3

$ tail -f blah
tail: cannot open `blah' for reading: No such file or directory
$ echo $?
1

처음에 파일이 존재하지 않는 경우 테스트할 수 있지만 파일에 액세스할 수 없게 되면 도움이 되지 않습니다. while이 경우 루프가 더 나을 수 있습니다.

while [ 1 ]
do
        tail $1
        if [ "$?" != "0" ]
        then
                echo "No access to file"
                exit 1
        fi
done

내 생각은스택 오버플로 답변. 다른 옵션도 있지만 이건 간단합니다.

관련 정보