inotifywatch
로그 파일의 변경 사항을 모니터링하는 스크립트를 작성하려고 합니다 . 특정 메시지가 로그 파일에 기록되면 특정 기능이 트리거되어야 합니다. 스크립트는 현재 다음과 같은 기본 형식으로 존재합니다.
while inotifywait -e modify /var/log/auth.log
do
alert=$(tail -n1 /var/log/auth.log | grep -E -o ".{0,7}password")
if [[ $alert == "Failed password" ]]
then
echo "FAILURE" >> test.log
elif [[ $alert == "cepted password" ]]
then
echo "LOGIN" >> test.log
fi
done
모든 것이 잘 작동합니다 - 모니터링되는 로그 파일이 inotifywatch
나타날 때까지회전. 그런 다음 작동이 중지됩니다. 회전하는 동안 감시된 파일의 이름이 변경된 다음 더 이상 기록되지 않고 그 자리에 inotify
감시하라는 메시지가 표시되지 않은 이전 이름의 새 파일이 생성되었기 때문이라고 생각합니다.
inotifywatch
using 에서 using 으로 전환하여 문제를 회피하려고 시도했지만 tail -f
여기에도 같은 문제가 적용되는 것 같습니다.
이제는 모니터링뿐만 아니라 파일 생성도 모니터링하고 수정을 위해 모니터링을 다시 시작하는 거대한 if
구조를 생성하면 이 문제를 해결할 수 있다는 것을 깨달았습니다 . 하지만 저는 일을 단순하게 유지하는 것을 좋아하는데 더 쉬운 방법이 있는지 아는 사람 있나요? (아니요, 저는 Fail2ban과 같이 미리 만들어진 솔루션을 사용하고 싶지 않습니다. 저에게 재미있는 부분은 간단한 도구를 사용하여 이와 같은 것을 직접 만드는 것입니다.)inotifywatch
modify
답변1
inotify
이름 대신 inode로 디렉터리의 파일을 모니터링하는 데 사용됩니다. 파일이 회전되면 해당 내용이 더 이상 변경되지 않습니다(데몬이 새로 생성된 로그 파일을 사용하도록 다시 로드될 때까지 짧은 시간 제외).
AFAIK는 tail -f
inotify 시스템을 사용하므로 도움이 되지 않습니다. 그러나 실행 가능한 솔루션이 있는 경우 버전이 이 기능을 지원하면 tail -f
tail tail --follow=name
( )을 사용하십시오 (POSIX tail은 지원하지 않음). 그러면 filename으로 식별된 파일이 모니터링됩니다. 다음은 매뉴얼 페이지에서 발췌한 내용입니다.tail -F
tail
tail
--follow (-f)를 사용하면 tail은 기본적으로 파일 설명자를 따릅니다. 즉, tail이 있는 파일의 이름이 바뀌더라도 tail은 계속해서 끝을 따릅니다. 이 기본 동작은 파일 설명자(예: 로그 회전)가 아닌 파일의 실제 이름을 실제로 추적하려는 경우 바람직하지 않습니다. 이 경우에는 --follow=name을 사용하십시오. 이로 인해 tail은 이름 바꾸기, 삭제 및 생성을 수용하는 방식으로 명명된 파일을 추적합니다.
[고쳐 쓰다]
사용 예:
tail -n0 -F my_file.log \
| while read -r log_line; do
do_something_with "$log_line"
done
파이프로 인해 while 루프가 하위 프로세스에서 실행되므로 루프 외부에서 변수를 수정하려는 경우 문제가 발생할 수 있습니다. 를 사용하는 경우 bash
바람직하지 않은 효과가 없지만 가독성이 떨어지는 다음 대체 구문을 사용할 수 있습니다.
while read -r log_line; do
do_something_with "$log_line"
done < <(tail -n0 -F my_file.log)
답변2
이 작업은 다음을 사용하여 수행할 수 있습니다.inotify기다려한 줄:
inotifywait -e move_self -e modify -m /path/to/some/file | awk '$2=="MODIFY" {system("/bin/echo Yes")}'
이것-중플래그 이벤트에 대해 파일을 무기한 모니터링합니다.move_self(파일 또는 디렉터리 이름 변경 모니터링 허용) 및조정, 출력을 다음으로 전달합니다.앗지우기 명령move_self이벤트, 내부 명령 실행체계각 괄호조정이벤트. 내 것을 대체하려면 자신만의 쉘 스크립트를 작성해야 합니다.에코주문하다. 다양한 아포스트로피와 따옴표를 참고하세요.